Proyecto de ejemplo para gestionar una base de datos MySQL usando Docker y Python con el conector mysql-connector-python. Incluye phpMyAdmin para la administración visual de la base de datos.
Este proyecto demuestra cómo:
- Configurar un entorno MySQL con Docker Compose
- Inicializar automáticamente una base de datos con datos de ejemplo
- Conectarse a MySQL desde Python
- Realizar operaciones CRUD (Create, Read, Update, Delete) en la base de datos
- Administrar la base de datos visualmente con phpMyAdmin
.
├── database/
│ ├── db_connection.py # Script Python con funciones CRUD
│ └── init_db.sql # Script de inicialización de la BD
├── docker-compose.yaml # Configuración de servicios Docker
├── .env # Variables de entorno (no incluido en Git)
├── .gitignore
└── README.md
Antes de comenzar, asegúrate de tener instalado:
- Docker (versión 20.10 o superior)
- Docker Compose (versión 2.0 o superior)
- Python (versión 3.8 o superior)
- Git
git clone https://github.com/mrodara/docker_bbdd_python.git
cd docker_bbdd_pythonCrea un archivo .env en la raíz del proyecto con las siguientes variables:
# Configuración MySQL
MYSQL_ROOT_PASSWORD=root_password
MYSQL_DATABASE=inventario
MYSQL_USER=test
MYSQL_PASSWORD=test
# Configuración phpMyAdmin
PMA_HOST=db
PMA_PORT=3306
⚠️ Importante: El archivo.envcontiene información sensible y no debe ser incluido en el control de versiones.
python3 -m venv .venv
source .venv/bin/activate # En Windows: .venv\Scripts\activatepip install mysql-connector-pythondocker-compose up -dEste comando:
- Descarga las imágenes de MySQL 8.0 y phpMyAdmin (si no están descargadas)
- Crea y arranca los contenedores en segundo plano (
-d) - Ejecuta automáticamente el script
init_db.sqlpara crear la tablaproductoscon datos iniciales - Configura una red personalizada
net-mysqlcon subnet192.168.100.0/24
docker-compose psDeberías ver algo similar a:
NAME IMAGE STATUS PORTS
mysql mysql:8.0 Up 0.0.0.0:3306->3306/tcp
phpmyadmin phpmyadmin/phpmyadmin Up 0.0.0.0:8080->80/tcp
# Ver logs de todos los servicios
docker-compose logs
# Ver logs de MySQL
docker-compose logs db
# Ver logs en tiempo real
docker-compose logs -fAbre tu navegador y accede a:
http://localhost:8080
Credenciales de acceso:
- Servidor:
db - Usuario:
test(orootpara acceso completo) - Contraseña:
test(oroot_passwordpara root)
Puedes conectarte directamente a MySQL usando cualquier cliente:
mysql -h localhost -P 3306 -u test -p
# Contraseña: testO desde Python usando el script incluido:
python database/db_connection.pyEl archivo database/db_connection.py incluye funciones para interactuar con la base de datos:
insertar_producto(conn, cursor, 'Laptop Gamer', 3, 1800.00)lista_productos = [
('Teclado Mecánico', 10, 75.50),
('Monitor Curvo', 5, 350.00),
('Ratón Gaming', 20, 45.99)
]
insertar_multiples_productos(conn, cursor, lista_productos)modificar_precio(conn, cursor, 'Teclado Mecánico', 50.65)eliminar_producto(conn, cursor, 6) # Elimina el producto con id=6# Asegúrate de que el entorno virtual está activado
source .venv/bin/activate
# Ejecuta el script
python database/db_connection.py| Campo | Tipo | Descripción |
|---|---|---|
| id | INT | Clave primaria (auto-increment) |
| nombre | VARCHAR(255) | Nombre del producto |
| cantidad | INT | Cantidad en inventario |
| precio | DECIMAL(10,2) | Precio del producto |
El script init_db.sql inserta automáticamente 3 productos de ejemplo:
INSERT INTO productos (nombre, cantidad, precio) VALUES
('Producto 1', 10, 10.0),
('Producto 2', 20, 20.0),
('Producto 3', 30, 30.0);docker-compose stopdocker-compose downdocker-compose down -vdocker-compose restartdocker-compose up -d --builddocker exec -it mysql bashUna vez dentro del contenedor:
mysql -u root -p
# Contraseña: root_passwordSi tienes MySQL instalado localmente, puede estar usando el puerto 3306. Soluciones:
-
Detener MySQL local:
sudo service mysql stop # Linux brew services stop mysql # macOS
-
Cambiar el puerto en
docker-compose.yaml:ports: - "3307:3306" # Usa el puerto 3307 en tu máquina
Verifica que las credenciales en DB_CONFIG (archivo Python) coincidan con las del archivo .env.
Si el script init_db.sql no se ejecuta:
- Elimina el volumen y vuelve a crear los contenedores:
docker-compose down -v docker-compose up -d
Asegúrate de usar %s como placeholder en las consultas SQL, no ?:
# ✅ Correcto (MySQL)
sql = "INSERT INTO productos (nombre, cantidad, precio) VALUES (%s, %s, %s)"
# ❌ Incorrecto (SQLite)
sql = "INSERT INTO productos (nombre, cantidad, precio) VALUES (?, ?, ?)"- Documentación de MySQL
- Documentación de Docker Compose
- mysql-connector-python
- phpMyAdmin Documentation
Este proyecto es de código abierto y está disponible bajo la licencia MIT.
mrodara
- GitHub: @mrodara
⭐ Si este proyecto te ha sido útil, ¡no olvides darle una estrella en GitHub!