Python 3 y MySQL: CRUD y ejemplos de conexión

Introducción

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.

Descargar el código fuente

Si lo deseas, puedes descargar todos los archivos que contienen el código fuente para conectar Python con MySQL.

mysql_python_crud

Una versión actualizada y en línea está en mi GitHub.

Requisitos

Instalar módulo PyMySQL

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í:

Instalación de PyMySQL con pip

Instalación de PyMySQL con pip

Crear base de datos en MySQL

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í:

Puedes usar phpmyadmin o la interfaz de MySQL workbench, tú decide. Sólo ten en cuenta que la base de datos y la tabla deben estar creadas y funcionando.

Primera conexión

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.

  • host: el host en donde nuestro servidor MySQL escucha. Normalmente es localhost o 127.0.0.1 pero igualmente podría ser otro, basta con poner la ip
  • user: el usuario que puede administrar la base de datos
  • password: la contraseña del usuario. Si está vacía dejamos las comillas vacías
  • db: el nombre de la base de datos a la que intentamos conectarnos

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.

Errores que podemos encontrar al conectar Python 3 con MySQL

Errores que podemos encontrar al conectar Python 3 con MySQL

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.

Insertar datos en MySQL desde Python 3

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.

Consultar datos de MySQL con Python 3

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:

Consultar registros de MySQL con Python 3

Consultar registros de MySQL con Python 3

Consultar datos de MySQL con Python 3 usando WHERE

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:

Consultar registros de MySQL con Python 3 usando WHERE

Consultar registros de MySQL con Python 3 usando WHERE

Editar filas de MySQL con Python 3

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:

Edición o actualización de datos en MySQL con Python 3

Edición o actualización de datos en MySQL con Python 3

Eliminar filas o registros de MySQL con Python 3

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.

Eliminación de filas, datos o registros de MySQL con Python 3

Eliminación de filas, datos o registros de MySQL con Python 3

Conclusión

Así es como terminamos este tutorial de Python 3 y MySQL o MariaDB. Aquí dejo algunas referencias

9 pensamientos sobre “Python 3 y MySQL: CRUD y ejemplos de conexión”

  1. 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

    1. 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/

  2. 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!!

    1. 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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *