pymysql – Controlador de base de datos MySQL

Versión: 2.6+, 3.x.

Introducción

pymysql es un paquete para la interacción con bases de datos MySQL escrito completamente en Python, a diferencia de su principal «competidor», MySQLdb. Se presenta como una atractiva alternativa a este último y con razón, pues las ventajas son bastante relevantes. Corre en distintas implementaciones de Python: CPython, PyPy y IronPython. Además, su instalación resulta más sencilla al prescindir de código escrito en C. Por último, y de las que más aprecio personalmente, soporte para el conjunto de versiones 3.x.

Descarga e instalación

Si cuentas con pip en tu ordenador, el proceso será de lo más sencillo. Ejecutar en la terminal:

pip install PyMySQL

Como alternativa, puedes descargar el código de fuente desde PyPI o bien desde el proyecto en GitHub. Una vez descomprimido el archivo, situarse en la carpeta recientemente creada y ejecutar:

python setup.py install

Ejemplos

Como la mayoría de los módulos para controlar un motor de base de datos, pymysql está basado en la DB-API; por lo tanto, usuarios con experiencia en otros paquetes (sqlite3, MySQLdb, por ejemplo) ya estarán familiarizados con la librería.

Establecer una conexión.

import pymysql

conn = pymysql.connect(
    host="localhost", port=3306, user="python",
    passwd="python1", db="recursospython"
)

Dirección del servidor (puerto e IP, host y port), datos de autenticación (usuario y contraseña, user y passwd) y nombre de la base de datos (db), que resulta equivalente a una futura ejecución de la consulta USE nombre_base_de_datos;. Para evitar problemas con caracteres especiales, siempre opto por indicar la codificación, añadiendo el parámetro charset.

charset="utf8"
 
Procedo a la creación de un cursor y ejecución de algunas consultas.

cursor = conn.cursor()
cursor.execute(
    "SELECT nombre, apellido FROM clientes"
)

for nombre, apellido in cursor.fetchall():
    print("{0} {1}".format(nombre, apellido))

La función fetchall retorna una lista con el conjunto de filas retornadas por la última consulta ejecutada. Por el contrario, fetchone() retorna el primer valor.

Por último, inserto datos en la tabla, guardo los cambios y cierro la conexión.

# Utilizo %s para integrar objetos en la consulta y prevenir inyecciones SQL.
cursor.execute(
    "INSERT INTO clientes VALUES (%s, %s)",
    ("Recursos", "Python")
)
# Guardar cambios.
conn.commit()
conn.close()

Es posible cerrar el cursor una vez que ha sido utilizado.

cursor.close()

Curso online 👨‍💻

¡Ya lanzamos el curso oficial de Recursos Python en Udemy! Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter en 2024.

Consultoría 💡

Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.

8 comentarios.

  1. seguí todos los pasos al pie de la letra según la documentación oficial, sin embargo no me he podido conectar, me retorna el error 2003 (connection refused) todos los datos están bien, ya intente de todo y me deja conectarme. Pensé que tal vez era un error con MySQL así que intente conectarme desde nodejs usando mysql2 pero todo fue bien, así que supongo que es un error pymysql, llevo mas de una semana sin poder resolverlo ;(

  2. Josue Pujols says:

    Hola! No funciona, cuando me intento conectar a la base de datos me sale el siguiente error:
    pymysql.err.OperationalError: (1045, «Access denied for user ‘root’@’localhost’ (using password: YES)»)
    No sé por qué!
    Gracias!

Deja una respuesta