En este capítulo, vas a ver como crear un método capaz de insertar registros en una tabla MySQL desde Python, además, empezamos con un ejercicio que mejore el método del capítulo anterior.
Ejercicio práctico de Python:
Empecemos este capítulo del curso Máster en Python con un ejercicio práctico.
El método mostrar_tablas(), muestra las tablas que hay en una base de datos, pero, ¿qué ocurre cuando no hay tablas en una base de datos?
# Método para mostrar las tablas de una base de datos @conexion @comprueba_bd def mostrar_tablas(self, nombre_bd): # Se selecciona la base de datos self.cursor.execute(f"USE {nombre_bd};") # Se informa de que se están obteniendo las tablas print("Aquí tienes el listado de las tablas de la base de datos:") # Realiza la consulta para mostrar las tablas de la base de datos actual self.cursor.execute("SHOW TABLES") resultado = self.cursor.fetchall() # Recorre los resultados y los muestra por pantalla for tabla in resultado: print(f"-{tabla[0]}.")
Resultado en la consola
Se abrió la conexión con el servidor.
Aquí tienes el listado de las tablas de la base de datos:
Se cerró la conexión con el servidor.
En este caso, estaría bien, que si no hay tablas en la base de datos, que devuelva un mensaje indicando eso mismo. El secreto está en la variable «resultado». Te dejo como ejercicio, que pienses en una solución de aquí al próximo capítulo.
Así con todo, te dejo el código completo por si te falla algo y para que puedas visualizarlo todo mejor.
Seguimos con la solución del ejercicio que propuse en el capítulo anterior. Se trataba de intentar mostrar un mensaje con el método mostrar_tablas() para cuando se utiliza con una base de datos sin tablas, ya que aparece de esta forma:
# Método para mostrar las tablas de una base de datos @conexion @comprueba_bd def mostrar_tablas(self, nombre_bd): # Se selecciona la base de datos self.cursor.execute(f"USE {nombre_bd};") # Se informa de que se están obteniendo las tablas print("Aquí tienes el listado de las tablas de la base de datos:") # Realiza la consulta para mostrar las tablas de la base de datos actual self.cursor.execute("SHOW TABLES") resultado = self.cursor.fetchall() # Recorre los resultados y los muestra por pantalla for tabla in resultado: print(f"-{tabla[0]}.")
Resultado en la consola
Se abrió la conexión con el servidor.
Aquí tienes el listado de las tablas de la base de datos:
Se cerró la conexión con el servidor.
Con fetchall(), se almacena una lista de tuplas, pero si no hay tablas en la base de datos, nos da una lista vacía ([]) entonces, con un simple condicional, podemos evaluar que si nos da ese resultado, que nos diga que no hay tablas en la base de datos.
La forma más clásica de hacer esto, sería así:
Con el return, evitamos que la ejecución siga más alla. Por lo tanto, esto debe ser colocado después de la declaración de la variable resultado y antes del bucle for.
if resultado == []: print(f"No hay tablas en la base de datos {nombre_bd}.") return
El orden del print() de la línea 8 también debe cambiarse, para que aparezca solo si hay tablas. En resumen, quedaría así:
# Método para mostrar las tablas de una base de datos @conexion @comprueba_bd def mostrar_tablas(self, nombre_bd): # Se selecciona la base de datos self.cursor.execute(f"USE {nombre_bd};") # Realiza la consulta para mostrar las tablas de la base de datos actual self.cursor.execute("SHOW TABLES") resultado = self.cursor.fetchall() #Evalúa si no hay tablas en la base de datos if resultado == []: print(f"No hay tablas en la base de datos '{nombre_bd}'.") return # Se informa de que se están obteniendo las tablas print("Aquí tienes el listado de las tablas de la base de datos:") # Recorre los resultados y los muestra por pantalla for tabla in resultado: print(f"-{tabla[0]}.")
Si en la base de datos que consultamos no hay tablas, esta es la salida:
Resultado en la consola
Se abrió la conexión con el servidor.
No hay tablas en la base de datos pruebas.
Se cerró la conexión con el servidor.
En cambio, si las hay, es esta otra:
Resultado en la consola
Se abrió la conexión con el servidor.
Aquí tienes el listado de las tablas de la base de datos:
-city.
-country.
-countrylanguage.
Se cerró la conexión con el servidor.
Método para insertar registros en la base de datos MySQL desde Python
Cambiamos totalmente de tema, esta vez, vamos a crear un método de inserción para los registros o filas.
Para crear un registro en MySQL, lo tenemos que hacer así:
USE nombre_base_datos; INSERT INTO {nombre_tabla} (columna1, columna2, ...) VALUES (valor1, valor2, ...);
Entonces, lo que voy a hacer, es un método que con el nombre de la base de datos, de la tabla y un diccionario, pase a la tabla las claves del diccionario como nombres de columna y los valores del diccionario como valores de columna.
Una posible solución será esta de aquí:
# Método para insertar registros en una tabla @conexion def insertar_registro(self, nombre_bd, nombre_tabla, registro): self.cursor.execute(f"USE {nombre_bd}") if not registro: # Si la lista está vacía print("La lista de registro está vacía.") return # Obtener las columnas y los valores de cada diccionario columnas = [] valores = [] for registro in registro: columnas.extend(registro.keys()) valores.extend(registro.values()) # Convertir las columnas y los valores a strings columnas_string = '' for columna in columnas: columnas_string += f"{columna}, " columnas_string = columnas_string[:-2] # Quitar la última coma y espacio valores_string = '' for valor in valores: valores_string += f"'{valor}', " valores_string = valores_string[:-2] # Quitar la última coma y espacio # Crear la instrucción de inserción sql = f"INSERT INTO {nombre_tabla} ({columnas_string}) VALUES ({valores_string})" self.cursor.execute(sql) self.conector.commit() print("Registro añadido a la tabla.")
Veamos la explicación parte por parte:
Se pasan tres parámetros al método:
- nombre_bd: nombre de la base de datos.
- nombre_tabla: nombre de la tabla.
- registro: una lista con un diccionario con 0 o 1 registro. (Más adelante, quizás modifique el método para que se le puedan pasar más registros de una vez).
Primero, se selecciona la base de datos en el servidor.
Se comprueba que la lista no esté vacía. Si es así, no sigue con el método, se cierra con un return. Aquí se determina que una lista vacía [] es False, recuerda lo de los valores «falsy» que comenté en otro capítulo. Dedicaré algún capítulo a explicar esto mejor.
Si la lista no está vacía, se crean dos listas vacías dentro del método. Una para guardar los valores de las columnas y otra para los valores que van en cada columna correspondiente.
El primer bucle for, se utiliza para obtener las columnas y valores a insertar en la tabla de la base de datos MySQL. Esto se hace iterando sobre la lista de diccionarios que se pasan como parámetro al método (registro). Para cada diccionario en la lista (registro), se utiliza el método keys para obtener una lista de las claves (columnas) del diccionario.
Luego, se utiliza el método extend() de listas Python, para agregar estas claves a la lista columnas. Por ejemplo, si el diccionario es {«nombre»: «Enrique», «apellidos»: «Barros Fernández»}, entonces el método extend() agregará las claves «nombre» y «apellidos» a la lista columnas.
Si le añades un par de print() después del for, verás lo que se guarda en cada lista:
# Obtener las columnas y los valores de cada diccionario columnas = [] valores = [] for registro in registro: columnas.extend(registro.keys()) valores.extend(registro.values()) print(columnas) print(valores)
Resultado en la consola
[‘nombre’, ‘apellidos’, ‘telefono’, ‘direccion’]
[‘Enrique’, ‘Barros Fernández’, ‘786959404’, ‘C/cualquiera’]
Finalmente, con los otros dos bucles, se iteran las posiciones de la lista columnas y de valores, para ir añadiendo cada posición a la instrucción SQL con una coma y un espacio. Al final de esto, hay que quitar el espacio y la coma, como hicimos con el método de crear tablas.
Todo esto, se guarda en valores_string y columnas_string.
Si los imprimes después de los bucles, verás lo que tiene cada string:
# Convertir las columnas y los valores a strings columnas_string = '' for columna in columnas: columnas_string += f"{columna}, " columnas_string = columnas_string[:-2] # Quitar la última coma y espacio valores_string = '' for valor in valores: valores_string += f"'{valor}', " valores_string = valores_string[:-2] # Quitar la última coma y espacio print(columnas_string) print(valores_string)
Resultado en la consola
nombre, apellidos, telefono, direccion
‘Enrique’, ‘Barros Fernández’, ‘786959404’, ‘C/cualquiera’
Estos dos strings, se los pasamos a la instrucción SQL de INSERT INTO, exactamente donde los necesita en la variable «sql».
Con el commit() confirmamos los cambios antes de cerrar la conexión con la base de datos.
Probemos con una lista vacía, a ver como se comporta el método.
registros = [] base_datos.insertar_registro("pruebas", "usuarios", registro)
Resultado en la consola
Se abrió la conexión con el servidor.
La lista de registro está vacía.
Se cerró la conexión con el servidor.
Bien, detecta correctamente que no le hemos pasado ningún registro.
Ahora, voy a pasarle uno:
registro = [{"nombre": "Enrique", "apellidos" : "Barros Fernández", "telefono" : "786959404", "direccion" : "C/cualquiera"}] base_datos.insertar_registro("pruebas", "usuarios", registro)
Resultado en la consola
Se abrió la conexión con el servidor.
Registro añadido a la tabla.
Se cerró la conexión con el servidor.
Dejamos el capítulo aquí. En el siguiente, te mostraré a hacer un método para eliminar registros y otro para actualizarlos. Te dejo como ejercicio, que los intentes crear antes de pasar al siguiente capítulo.
No te pierdas nada del curso Máster en Python.
Hola, me puedes ayudar con este error?, en la consola me indica que se abre la conexión con el servidor, luego me indica que ocurrió un error con la llamada y posteriormente se cierra la conexión. Y no puedo ingresar los registros en la tabla.
Hola Kike..Un gran trabajo haz hecho con este curso. esta fue la solucion que hice. Considere no mencionar las tablas que hay en la base de datos si es no las habia. Solo decir que en la base de datos xx no hay tablas. Gracias por compartir tus conocimeinetos.
def mostrar_tablas(self, nombre_bd):
self.cursor.execute(f»USE {nombre_bd};»)
self.cursor.execute(«SHOW TABLES»)
resultado = self.cursor.fetchall()
if not resultado:
print(f’La base de datos {nombre_bd} no tiene tablas.’)
return
print(f»Aquí tienes el listado de las tablas de la base de datos ‘{nombre_bd}’:\n»)
for tabla in resultado:
print(f»-{tabla[0]}.»)