jueves, 19 de octubre de 2023

Manejo de bases de datos SQL con Python y SQLite

Conteo de vocales de un texto con Python

Vamos a revisar un ejemplo sencillo sobre como manejar la librería sqlite de Python para manejar una base de datos sencilla.

Realizaremos la creación de la base de datos, la creación de una tabla, el ingreso de registros a la base de datos desde un archivo csv y luego ejecutaremos unas consultas de prueba para validar el funcionamiento.

Librerías necesarias

Para este ejemplo vamos a manejar dos paquetes de python, sqlite y csv. Estos ya vienen agregadas por defecto en la instalación de python, por lo que no es necesario realizar una instalación.

Creación de la base de datos y la tabla de ejemplo

Ahora vamos a describir el código necesario para la creación de la base de datos y la tabla con la que vamos a trabajar. Sqlite crea una base de datos tipo archivo, nosotros debemos definir en qué lugar se va a almacenar ese archivo, indicándole una ruta y un nombre como se muestra a continuación.

# Realizamos la importación los módulos necesarios
# de las librerías antes mencionadas
from sqlite3 import connect
from csv import reader

# Definimos la ruta en la que se va a almacenar nuestra base de datos  
# En este caso el mismo directorio del script
database = "./myDatabase.db"

# Creamos la conexión a la base de datos
# Al realizar esto, se va a crear el archivo con el nombre indicado
conn = connect(database)

Hasta ahora tenemos creado el archivo en el que se va a gestionar nuestra base de datos. Ahora vamos a darle estructura a ese archivo creando una tabla de esta manera:

# Creamos un cursor a partir de la conexión anterior
cursor = conn.cursor()

# Mediante este cursor enviamos a ejecutar el comando
# para crear la tabla movies que tiene tres campos
# id, title y rating
cursor.execute("""
CREATE TABLE IF NOT EXISTS movies(
            id INTEGER NOT NULL PRIMARY KEY,
            title TEXT,
            rating INTEGER
 );""")

Como vemos, la tabla creada es sencilla, tiene tres campos, un id de tipo numérico, el cual se indica que no puede ser nulo, además de ser la llave primaria de la tabla, un campo title de tipo texto y un campo rating de tipo entero que indica una calificación de 1 a 5.

Insertando datos en la tabla

Para realizar la inserción de datos, vamos a leer un archivo csv (data.csv) que contiene registros de ejemplo con la siguiente estructura:

1,"La era del hielo",5
2,"Shrek",4
3,"Spiderman",1
4,"Lluvia de hamburguesas",2
5,"Rápidos y furiosos",2
6,"Una noche en el museo",3
7,"Malcom X",4
8,"El mito",4
9,"El día después de mañana",1
10,"Avatar",5
11,"Avengers",5
12,"Titanic",3
13,"El Rey león",3
14,"Barbie",2
15,"Pasión por el triunfo: Fuego y hielo",2
16,"Pantera Negra",2
17,"Super Mario Bros",5
18,"Frozen: El reino del hielo",1
19,"Jurassic World",3
20,"La bella y la bestia",3
21,"Iron Man",4
22,"Amor sobre hielo",4

Lo primero que haremos será leer los datos del archivo csv, transformarlos en tuplas y agregarlos en una lista:

# Definimos una lista vacía
data = []
#Abrimos el archivo en modo lectura (read)
with open("data.csv", "r") as d:
	# Usamos la función reader del paquete csv para leer el archivo
    items = reader(d)
    # Iteramos los registros del archivo para convertirlos en tuplas y agregarlos a la lista data
    for item in items:
        data.append(tuple(item))

Es importante convertir los registros del archivo csv a tuplas para poder realizar la inserción en la base de datos

Con esta lista de tuplas y usando el cursor previamente creado, vamos a ejecutar una inserción múltiple a la base de datos así:

cursor.executemany("INSERT INTO movies VALUES(?, ?, ?)", data)

De esta manera, al pasarle la lista de tuplas, el comando executemany va a realizar las tareas necesarias para agregar esos datos en el sql de inserción.

En este punto ya hemos creado la base de datos y una tabla con sus respectivos datos, así que ya podemos ejecutar consultas de ejemplo para probarla.

Consultando datos

Recuperar las películas cuyo rating sea mayor a 3

res = cursor.execute("""SELECT *
            FROM movies
            WHERE rating > 3
            """)
ans = res.fetchall()
for i in ans:
    print(i)

Respuesta:

(1, 'La era del hielo', 5)
(2, 'Shrek', 4)
(7, 'Malcom X', 4)
(8, 'El mito', 4)
(10, 'Avatar', 5)
(11, 'Avengers', 5)
(16, 'Super Mario Bros', 5)
(20, 'Iron Man', 4)

Recuperar las películas cuyo rating sea igual a 1

res = cursor.execute("""SELECT *
            FROM movies
            WHERE rating = 1
            """)
ans = res.fetchall()
for i in ans:
    print(i)

Respuesta:

(3, 'Spiderman', 1)
(9, 'El día después de mañana', 1)
(17, 'Frozen', 1)

Recuperar las películas cuyo título contenga la palabra hielo

res = cursor.execute("""SELECT *
            FROM movies
            WHERE title like '%hielo%'
            """)
ans = res.fetchall()
for i in ans:
    print(i)

Respuesta:

(1, 'La era del hielo', 5)
(15, 'Pasión por el triunfo: Fuego y hielo', 2)
(18, 'Frozen: El reino del hielo', 1)
(22, 'Amor sobre hielo', 4)

Y hasta aquí llegamos con este ejemplo, espero que les sea de ayuda y sirva como guía para trabajar con sqlite en python.

No hay comentarios.:

Publicar un comentario