Acceso a base de datos MySQL con Python
MySQL es uno de los motores de base de datos más utilizado en la actualizada. Veremos como operar en una base de datos desde Python utilizando el módulo pymysql.
En Python existe DB-API, una API estándar que es implmentada por la mayoría de los módulos para acceder a motores de base de datos relaciones.
Una API, Apllication Porgramming Interface, es un conjunto de rutinas que proveen acceso a funciones de un software.
Por lo tanto, las instrucciones utilizadas en esta nota serán similares a las utilizadas para conectarse con el resto de los motores.
Lo primero que tendremos que hacer es instalar el módulo pymsql. Abriendo una consola ejecutaremos el siguete comando.
pip install pymysql
Para tener acceso a MySQL deberemos en principio importar el módulo pymysql.
Luego definiremos los datos para la conexión y estableceremos un cursor.
A través del método execute() del cursor realizaremos las consultas a nuestra base de datos.
En nuestro primer ejemplo crearemos la base insumos.sqlite, dentro de la cual crearemos la tabla productos con tres campos:
import
pymysql#crea conexión con motor mysql
conn = sqlite3.connect("insumos.sqlite"
) conn=pymysql.connect( host="localhost"
, user="tu_usuario"
, passwd="tu_clave"
, database="python_db"
)#establece cursor
cursor = conn.cursor()# Ejecutar una consulta
sql_create="CREATE TABLE productos (id_prod INT PRIMARY KEY AUTO_INCREMENT, producto VARCHAR(60),precio FLOAT)"
cursor.execute(sql_create) conn.close()
Para poder visualizar y trabajar con una base realizada en MySQL podemos utilizar MySQL Workbench www.mysql.com/products/workbench/.
La base creada se verá así:
A continuación vamos a ingresar registros en nuestra tabla. En este ejemplo utilizaremos una tupla con los datos.
Luego realizaremos un bucle con los INSERT correspondientes. La conexión y cursor se utilizan como en el ejemplo anterior, de igual forma para los ejemplos siguientes.
#Ingreso de datos
productos = ( ("Teclado"
, 1300.99), ("Mouse"
, 560.55), ("Pendrive 16 MB"
, 800.25) )for
producto, precioin
productos: cursor.execute("INSERT INTO productos VALUES (null, %s, %s)"
, (producto, precio))# Guardar los cambios
conn.commit() conn.close()
Notar que para confirmar los cambios hemos utilizado el método commit() de la conexión.
Utilizaremos commit siempre que realicemos una modificació de datos: INSERT, UPDATE, DELETE
Por último cerramos la conexión con el método close().
Para evitar Inyección de SQL, en las consultas nunca se debe utilizar ninguno de los métodos que provee Python para incluir variables dentro de una cadena, como placeholders, a menos que previamente realicemos las verificaciones pertinentes.
En su lugar, se coloca el signo porciento seguido de la letra s (%s) por cada valor que se quiera reemplazar, y luego se pasan los valores dentro de una tupla como segundo argumento.
Trataremos la Inyección de código SQL en otra nota.
La tabla con datos se verá así:
El método fetchall() retorna la información devuelta por la consulta en una lista que contiene tuplas, y cada una de estas corresponde a una fila de la tabla.
cursor.execute("SELECT * FROM productos"
) productos = cursor.fetchall()for
id_prod, producto, precioin
productos: print(f"{id_prod} - {producto} t${precio}")
El método fetchone() retorna la información devuelta en una tupla que corresponde a un sólo registro de la tabla.
cursor.execute("SELECT count(*) FROM productos where precio < 1000"
) cantidad = cursor.fetchone()f"Productos económicos: {cantidad[0]}"
)
Si por algún motivo una consulta no puede ejecutarse, se lanzarán distintas excepciones dependiendo de la falla la cual puede ser capturada mediante una estructura try-except, como la siguiente:
#consulta con sintaxis mal
try
: cursor.execute("SELECT * FROM arituloa
)except
pymysql.err.ProgrammingError:"error de sintaxis o tabla inexistente"
)except
pymysql.OperationalError:"campo inexistente o create de tabla existe"
)
Más información sobre MySQL en ww.mysql.com
Este y otros contenidos los podés aprender en el Curso de Python