MySQL + Docker

He tenido experiencia trabajando con mySQL, lo he utilizado para aplicaciones web con PHP, y ha sido muy utilizado en esos ámbitos por su ligereza y porque se ha mantenido gratis.

A diferencia de veces anteriores, en esta oasión estoy instalando MySql en mi equipo dentro de un contenedor de Docker. Además, para poder hacer persistentes mi base de datos, la asocié a un volumen, todo eso mediante el siguiente comando que ejecuté desde PowerSell:

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=tu_contraseña -e MYSQL_DATABASE=nombre_de_tu_bd -p 3306:3306 -v mysql_data:/var/lib/mysql -d mysql:latest

Asignando nombres únicos y manteniendo el mismo puerto, puedo emular diferentes ambientes para las bases de datos con la condición de solo tener una instancia activa.

Desde Powershell, mediante el siguiente comando puedo trabajar directamente en la interfaz CLI de MySql

docker exec -it mysql-container mysql -u root -p

Solo debo proporcionar la contraseña que especifiqué al configurar el contenedor.

Aquí muestro las bases de datos de mi instancia.



El comando show databases me permite obtener esta información.

Aquí estoy cambiando a mi base de datos y luego mostrando que no tengo tablas aún.



Con la siguiente instrucción en MySQL estoy creando una tabla para almacenar información básica de usuarios.


Explico: NOT NULL indica que la columna no puede contener datos vacíos, PRIMARY KEY indica que la columna funciona como llave principal (sin datos vacíos, un índice, datos únicos), DEFAULT 0 indica que la columna tandrá un valor por defecto si es que no se especifica cuando se agrega un nuevo registro.

Con la siguiente instrucción estoy creando una tabla cuya información depende de la tabla de Usuarios.

Explico: CONSTRAINT define una condición para la tabla, FOREIGN KEY indica que la condición es una llave foránea, es decir, los datos de la(s) columna(s) especificada(s) deben existir en la tabla que se indica por REFERENCES; además ON UPDATE NO ACTION ON DELETE NO ACTION indica que al actualizar y al borrar no se realiza ninguna acción en particular (hay otras opciones de comportamiento aquí que de momento no ahondaré).

En la siguiente imagen estoy mostrando las tablas de mi base de datos.


En la siguiente imagen estoy insertando un par de registros.


Explico: Estoy especificando las columnas que no aceptan valores nulos, a exceción de la columna de ID que es llave primaria con valor automático (AUTO_INCREMENT), y después de VALUES indico entre paréntesis los valores por registro que voy a insertar; separo los valores por comas y encierro entre comillas simples o apóstrofes los valores que corresponden a cadenas de texto (VARCHAR|CHAR), los registros están separados también por comas.

En esta ocasión, en el INSERT no especifico las columnas que reciben valores por defecto.


En la siguiente imagen muestro los registros existentes en mi tabla.


Explico: La consulta es de selección, donde a continuación de SELECT estoy listando las columnas a mostrar, en la línea del FROM indico de qué tabla(s) voy a utilizar para obtener la información, y después del ORDER BY indico mediante qué columnas voy a ordenar (por defecto es ascendente y con DESC indico que esa columna irá en forma descendente).

En la siguiente imagene stoy intentando dos operaciones de inserción de datos, la primera es satisfactoria y la segunda falla.


Explico: Debido a que la tabla DatosUsuario depende de la existencia de registros en la tabla de Usuarios, y que el IdUsuario es tanto llave primaria como foranea, estos datos deben ser únicos y no pueden ser nulos o vacíos, además, el valor de esa columna debe existir en la tabla de Usuarios, es por eso que la segunda consulta falla, debido a que el Id 5 no existe.

A continuación muesto un par de consultas que utilizan las dos tablas.

Explico: En la parte FROM de las consultas estoy nombrando las tablas que utilizaré y por medio de AS (que es opcional) indico que haré referencia a cada una por un nombre distinto, usualmente más corto, además que agregué las palabras LEFT JOIN y ON para indicar que se tomará como tabla principal la de la izquierda y con base en qué columnas estaré haciendo la asociación entre ambas tablas. Esto hace que obtenga todos los registros de la tabla de la izquierda (Usuarios) y solo los registros de la tabla de la derecha que coincidan de acuerdo con la parte ON.

Comentarios

Entradas populares