Guia SQL - Python
Guia SQL - Python
de datos con Python, partiendo de los conocimientos que ya tenemos en MySQL y WorkBench
Para iniciar debemos instalar MySQL y WorkBench, tal cual como se vio en el curso de SQL.
Vamos a repasar la creación de un nuevo Schema o BD con nombre personas_db y la creación de
una tabla con nombre personas con los campos o atributos id_persona, nombre, apellido, teléfono
y correo.
Recordemos qué es una clave primaria y modifica la tabla anterior y configura a la columna
id_persona como clave primaria y autoincremental, y marca al campo correo como único. Ahora
creemos otras dos tablas una llamada pedidos con el campo id_pedido como primary key - AI.
Agrega el campo id_persona para configurarlo como llave foránea en relación con la tabla personas.
Además, agrega los campos cantidad, descripción_producto y fecha_pedido.
Crea otra tabla llamada compras agregar id_compra como PK – IA. Agrega el campo id_persona
para configurarlo como llave foránea en relación con la tabla personas. Además, agrega los campos
total_pagado, metodo_pago. Procede a configurar las claves foráneas en las tablas pedidos y
compras. Luego agrega 3 registros a la tabla personas
Luego procedemos a crear un objeto que será de tipo mysql, con la siguiente información entre
parentesis
Luego procedemos a crear un objeto de tipo cursor para poder interactuar con la base de datos
Finalizar el cursor y la conexión a la base de datos: debemos finalizar el cursor invocando el método
close(), esto es considerado una buena práctica ya que previene errores en la administración de la
base de datos y posibles ataque de seguridad. También debemos finalizar la conexión a la bd usando
el objeto de tipo mysql y llamar al método close().
así liberamos a la base de datos ya que si la mantenemos abierta consumiríamos más recursos como
memoria ram y de igual forma consumiríamos más recursos del servidor. También puede generar
errores si otros programadores intentan acceder a la base de datos
Insertar datos desde Python: Para agregar valores lo haremos de la misma forma como se hace
en workbech, pero dentro de los paréntesis del método execute(). También debemos tener en
cuenta que al agregar valores que sean de tipo cadena, debemos usar comillas distintas a las
comillas donde estamos encerrando la sentencia SQL, ejemplo en la siguiente imagen. Luego
debemos usar el método commit() que es el que guardará de manera permanente la información
en la base de datos.
Otra forma de ingresar datos y la más recomendada es usando marcadores de posición %s los signos
de porcentaje y la letra s, actúan como un parámetro para recibir valores. Como se ve en la imagen
siguiente, almacenamos una sentencia SQL como cadena en una variable, en la consulta podemos
ver que los valores son marcadores de posición %s que actuarán como parámetros. En la línea 14
vemos que tenemos una tupla con datos, estos serán los valores que se pasarán a los marcadores
de posición en el mismo orden como están ubicados. Luego en la línea 15 vemos que mi_cursor
invoca al método execute y se le pasan dos parámetros, primero la sentencia que habíamos
almacenado como cadena en la variable sentencia_sql, como segundo parámetro se pasa a la tupla
que contiene los valores. En el ejemplo anterior le pasamos a execute() toda la sentencia incluyendo
los valores, esto podría provocar una vulnerabilidad en el sistema quedando expuesto a ataques
donde puedan robar, manipular o alterar información de la base de datos.
El método execute permite pasar 3 parámetro, el primero es obligatorio que es la sentencia sql, los
otros dos son opcionales. El segundo son los valores como vimos en el ejemplo anterior y solo recibe
como valores a listas, tuplas, o diccionarios. El tercer parámetro es multi=True o False, multi puede
ser igual a True o False, sirve para agregar varias consultas diferentes a la vez, en una sola cadena
de texto como primer parámetro, si queremos hacerlo, entonces multi de ser =True, como se ve en
la siguiente imagen
Para actualizar un registro de la bd usamos el comando UPDATE, igualmente podemos crear una
variable que contenga la cadena de texto con la sentencia SQL y una tupla con los valores, usando
los marcadores de posición para prevenir sql injection, en la siguiente imagen se actualiza un
registro, de manera específica se indica que sea un registro con id_persona = 15.
Esta parte es muy importante: si NO filtramos con WHERE a qué registro se le desea hacer la
actualización, entonces se entenderá que se quieren actualizar todos los registros de la tabla y al
tener un commit() los cambios en la base de datos no se puede deshacer.
Eliminar datos desde Python: Crea un nuevo archivo y configura la conexión a la base de datos
personas_db, hazlo sin ver el archivo anterior para que practiques la configuración. Igualmente,
práctica creando el objeto tipo mysql y el cursor
Para eliminar un registro de la bd usamos el comando DELETE, igualmente podemos crear una
variable con la sentencia sql y una tupla con los valores. Muy importante: filtrar con WHERE qué
registro se desea eliminar, sino se hace, se eliminarán todos los datos de la tabla al tener un
commit
Ejercicio de práctica: en el siguiente ejercicio usaremos programación orientada a objetos y bases
de atos con mysql.
Crea una clase llamada persona con los siguientes atributos, aplica encapsulamiento:
Nombre (String)
Apellido (String)
Telefono (String)
Correo (String)
Registrar persona: debe crear una instancia de la clase persona y luego invocar al método
insertar_persona
Realizar pedido: debe invocar al método hacer_pedido
Realizar compra: debe invocar al método comprar
Para configurar el pool partiremos de los conocimientos que tenemos para crear una conexión.
Empecemos importando los siguientes módulos y creando una clase llamada Conexión, con los
atributos de clase definidos como constantes con los valores que se ven en la siguiente imagen
Luego debemos crear un método de clase llamado obtener_pool(cls) donde
primero preguntamos con un if si el pool is None parar saber si ha sido creado el pool, si no es None
entonces el método retorna al pool. Si es None entra al if y luego se abre un bloque try, para el
manejo de excepciones, dentro del try llamamos al atributo de clase
pool = pooling.MySQLConnectionPool para crear el pool de conexión. Dentro del método se asignan
las constantes a las variables como se ve en la imagen. Luego, asigna el pool a cls.pool y lo retorna.
Si hay un error al crear el pool, captura la excepción y lanza una nueva excepción personalizada.
Error es una excepción específica de mysql.connector que ocurre cuando hay problemas en la
conexión.raise Exception(...) genera un nuevo error con un mensaje más descriptivo.
Luego debemos crear otro método de clase que retornará una conexión, podemos llamarlo
obtener_conexion(cls) Este método solo estará encargado de retornar al metodo obtener_pool()
invocando al metodo get_connection() todo esto lo encerramos en un bloque Try except
Finalmente, para obtener una conexión debemos crear en el programa principal una variable que
contendrá al objeto conexión. Ejemplo en la siguiente imagen
Es importante cerrar la conexión y el cursor. Existe otra opción para finalizar las conexiones y
cursores que ayudan minimizar errores, por olvidar cerrar las conexiones
El with permite encerrar en su interior la creación de una conexión o un cursor, asegurando que los
recursos se gestionen automáticamente. Dentro de su bloque, se ejecutan las operaciones
necesarias sobre la conexión o el cursor. Al finalizar el bloque, with se encarga automáticamente de
liberar los recursos, cerrando la conexión o el cursor que hayan sido abiertos dentro de él, incluso
si ocurre un error durante la ejecución.
Ejercicio Evaluación:
Ejercicio propuesto
Objetivo:
✔ Permita interactuar con una base de datos en MySQL y las tablas clientes, productos, compras
y detalles_compra.