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.
kaled says:
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 ;(
Recursos Python says:
Hola, ¿chequeaste que no haya algún firewall bloqueando conexiones del proceso de Python?
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!
Recursos Python says:
Hola Josue. Simplemente el usuario que estás usando (root) no tiene permisos para conectarse a la base de datos que elegiste, no tiene que ver con Python.
Saludos
CARLOS says:
Y COMO SOLUCIONO ESO
Recursos Python says:
Lo tenés que solucionar desde el gestor de base de datos (p. ej. phpMyAdmin) o desde la consola de MySQL.
Saludos
SYee says:
Excelente, muchas gracias
Luis Rodrigo says:
Perfecto, estuve buscando esto por mucho rato y por fin pude conectarme a la base