Recientemente vimos cómo trabajar con Python3 y SQLite3. Hoy veremos cómo combinar Python3 y MySQL para insertar, editar, eliminar y mostrar registros en esta base de datos tan popular. Así que veamos este tutorial fácil con ejemplos y demostración.
Para conectar MySQL y Python 3 vamos a utilizar el paquete llamado PyMySQL.
Nota: también he escrito tutoriales para conectar Python con SQL Server y con PostgreSQL.
Si lo deseas, puedes descargar todos los archivos que contienen el código fuente para conectar Python con MySQL en mi GitHub.
Para instalar lo que nos permitirá conectarnos con MySQL desde Python 3 ejecutamos el siguiente comando:
pip install PyMySQL
En caso de que ese comando no llegara a funcionar, podemos usar:
python -m pip install PyMySQL
Si incluso así sigue sin funcionar, recuerda configurar e instalar Python. Cuando instales correctamente la librería, se mostrará algo así:
Para poder trabajar con Python 3 y MySQL debemos tener una base de datos en éste último. Para ello nos conectamos a nuestro servidor de MySQL y creamos una base de datos. Durante el tutorial trabajaremos con una base de datos de películas que tendrá una tabla llamada también películas, y sólo eso.
En mi caso voy a utilizar la CLI de MySQL. La definición de la tabla y la creación de la base de datos queda así:
Cuando lo ejecuto en la CLI de MySQL se ve así:
Antes de hacer el CRUD vamos a ver si nos podemos conectar a la base de datos. Para ello ponemos este fragmento de código en un try/except:
Aquí hay unos parámetros que debemos tener en cuenta.
Si todo va bien, al ejecutar el script debe mostrar el mensaje:
Conexión correcta
En caso de que no, se mostrarán errores. Aquí abajo dejo los más comunes.
En el primer caso es porque puse localhosts en lugar de localhost. Esto también pasará si ponemos una IP en donde el servidor no esté escuchando.
En el segundo caso puse un usuario que no está registrado o que no tiene permiso para esa base de datos.
El el tercer caso puse el nombre de una base de datos que no existe.
Continuemos entonces.
Antes de continuar cabe mencionar que los ejemplos aquí son 100 % seguros. Es decir, nuestras consultas prevendrán las inyecciones SQL.
Para insertar una película hacemos esto:
Como vemos, necesitamos tener la conexión. Y luego usamos un cursor para ejecutar nuestra consulta sobre la misma.
Es importante notar que usamos %s en lugar del valor real, y luego ponemos los verdaderos datos en la llamada a .execute del cursor. Esto es para que sea una consulta segura y las variables sean escapadas en caso de que un usuario malicioso quisiera aprovechar esa vulnerabilidad.
Más abajo hacemos un commit. Esto es para guardar los cambios que hicimos a la base de datos, si no llamamos a este método ninguno de nuestros cambios se reflejará.
Todo eso lo encerramos en un bloque try/finally (aparte del que pertenece a la conexión) y siempre cerramos la conexión. Así, si hay un problema con la inserción, la conexión no quedará abierta.
Ya vimos cómo insertar, ahora vamos a ver cómo listar o consultar. Para ello usamos el siguiente código:
Siempre usamos el cursor. Ahora llamamos al método fetchall que traer todas las filas. No deberíamos usarlo para grandes datos, pues si hay 1000 filas traerá todas.
Si quisiéramos traer una por una podríamos llamar al método fetchone. En fin, al ejecutar el script sale esto:
Para hacer una consulta con WHERE tenemos que limpiar los datos para prevenir inyecciones. Aquí un ejemplo en donde consultamos las películas cuyo año sea mayor que el 2000.
Lo que hay que notar es que siempre usamos los placeholders %s en lugar de concatenar valores. Al ejecutar eso, este es el resultado:
Veamos ahora cómo hacer un update o una edición de datos. Igualmente usaremos el cursor, y prepararemos la sentencia para que la misma sea segura.
Lo que hace el siguiente código es cambiar el nombre a “Ready Player One: comienza el juego” en donde la película tenga el id 2.
Siempre tenemos que usar placeholders, nunca concatenar. Y cuando hacemos una operación que modifique la base de datos (insert, update, delete) tenemos que hacer commit para reflejar los cambios.
En la imagen podemos ver que primero listamos los datos y el título de la película es el antiguo. Luego ejecutamos el script para actualizar, y al volver a listar observamos que la película tiene un nuevo nombre:
Para terminar con este tutorial vamos a ver cómo eliminar datos. Es exactamente igual que cuando hacemos un update o insert.
El siguiente fragmento de código elimina las películas que se hayan estrenado antes del año 2000:
Para comprobar que realmente está eliminando primero listamos las películas, luego ejecutamos la eliminación y finalmente volvemos a listar.
Al final sólo quedan 2 películas.
Así es como terminamos este tutorial de Python 3 y MySQL o MariaDB. Aquí dejo algunas referencias
La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…
Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…
El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…
El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…
En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…
Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…
Esta web usa cookies.
Ver comentarios
Excelente
Hola, gracias muy buena la información!! quería saber si tienes algo o me puedes recomendar para trabajar mysql desde formularios seria hacer el crud pero desde el navegador web?
Puede usar HTML y JavaScript del lado del cliente (si quiere, con un framework), y la siguiente API: https://parzibyte.me/blog/2020/11/10/api-rest-python-flask-sqlite3/
Gracias Colega. El unico sitio despues de ver 5 y con diferentes librerias que no funcionaban. Tu ejempolo es claro y funciona. Mil gracias amigo. 27.10.22
Gracias por sus comentarios. Saludos y éxito!
porque utilizar esta libreria y no utilizar
import mysql.connector
?
Hola. Usted puede usar cualquier librería o método que prefiera, aquí expongo lo que yo prefiero usar.
Saludos!
Muchísimas gracias por compartir tanta y tan buena información parzibyte.
Con lo que cuesta mantener un blog!!!
El tuyo es una maravilla.
Gracias por sus comentarios :)
Buenas Tardes
Interesante y útil sus apuntes
Por favor, como haría para vaciar el contenido de una tabla en QT5
Hola, simplemente al arreglo de datos hay que volcarlo sobre la tabla. Espero hacer un tutorial sobre ello en el futuro, pues es muy largo de explicar en un comentario.
Saludos :)
muy buen tutorial para conocer algo muy basico pero escencial que tienen todas las aplicaciones, las formas de manejar los datos un una base de datos.
Hola,
Muchísimas gracias, muy interesante. Dos cosas:
Creo que hay una errata en "Primera conexión" > en la línea 6: "db='peliculass')". Será "db='peliculas')", con una "s", ¿no?
Y a mi me da un error: Ocurrió un error al conectar: (1049, "Unknown database 'fondos'")
¿hay que poner la bdd.tabla? No me sale de ninguna fomra
gracias parzibyte
Es un placer ayudar. Te invito a seguirme en mis redes sociales y suscribirte para estar al tanto de mi contenido :)
Hola. Gracias por tus comentarios. Sobre la errata que mencionas, lo había puesto así para generar un error pero olvidé cambiarlo al subirlo; ya lo he corregido.
Sobre el segundo: debes crear una base de dato llamada fondos (ya que no se crea automáticamente), recuerda que una base de datos tiene tablas dentro de la misma.
Si no sabes mucho sobre MySQL puedes ver unos ejercicios: https://parzibyte.me/blog/2018/02/06/ejercicios-resueltos-consultas-sql-mysql/
O sobre la CLI: https://parzibyte.me/blog/2018/09/19/primeros-pasos-con-la-cli-de-mysql/
Tantas páginas, videos y cosas vistas, y esta si que es la más completa de todas y sobre todo explica el por qué usar %s en lugar de concatenar. Me gustaría saber si hay forma de poder reutilizar el código así como en php, es decir, hacer un require_once 'db.php' para luego un db = new Conexion , es decir, tener la conexión en un archivo para ser llamada en los diferentes archivos .py donde vaya a manipular datos. Muchas Gracias por tu tiempo y dedicación!!
Gracias por tus comentarios :-)
Nota: el código pierde las tabulaciones al pegarlo aquí, pero sirve para ejemplificar, no lo copies directamente.
Respondiendo a tu duda, claro que sí, puedes importar tus módulos en Python. Por ejemplo, pega el código de conexión en un archivo llamado base_de_datos.py que residirá junto a tu código principal:
import pymysql
def conectar():
try:
conexion = pymysql.connect(host='localhost',
user='root',
password='',
db='peliculas')
return conexion
except (pymysql.err.OperationalError, pymysql.err.InternalError) as e:
print("Ocurrió un error al conectar: ", e)
return False
Ahí definimos a la función conectar. Luego, en tu código principal importa la función y llámala:
from base_de_datos import conectar
conexion = conectar()
La sintaxis es "from tuArchivo import tuFuncion". Ahora ya puedes usar la conexión normalmente, suponiendo que fue exitosa.
Más información de módulos: https://docs.python.org/2/tutorial/modules.html