Link Search Menu Expand Document
El Libro De Python (24.95 €) 39.95 €

Bases de datos con sqlite

Veamos como trabajar con bases de datos para persistir nuestra información en el disco y que pueda ser usada una vez nuestro código ha terminado. Sin algún tipo de persistencia, toda la información que tu programa sabe es olvidada una vez este acaba.

Hay muchas formas de hacerlo. Puedes almacenar la información en un simple fichero. O puedes usar bases de datos relacionales y lenguajes como SQL.

En este ejemplo usaremos sqlite3 para almacenar nuestros gastos mensuales en una base de datos gastos.db. Se trata de un paquete muy sencillo de utilizar y a diferencia de otros no requiere un servidor externo.

Empezamos creando la base de datos y una tabla llamada gastos con dos campos:

  • 🏷️ categoria: Tipo de gasto almacenado. Es un texto TEXT.
  • 💰 cantidad: Cantidad del gasto. Es un número real REAL.

Como puedes ver exigimos que en ambos casos el campo no puede ser NULL. Es decir, que no lo puedes dejar vacío. Todo el contenido de nuestra base de datos se almacenará en el fichero gastos.db.

import sqlite3

def conecta_db():
    return sqlite3.connect('gastos.db')

def crea_tabla():
    with conecta_db() as conn:
        conn.execute('''
            CREATE TABLE IF NOT EXISTS gastos (
                categoria TEXT NOT NULL,
                cantidad REAL NOT NULL
            )''')

Ahora necesitamos una función para añadir gastos a nuestra tabla.

def add_gasto(categoria, cantidad):
    with conecta_db() as conn:
        conn.execute('''
            INSERT INTO gastos (categoria, cantidad)
            VALUES (?, ?)''', (categoria, cantidad))

También una función para obtener los gastos. Esta función consulta la base de datos y nos devuelve los gastos que han sido almacenados. También puedes usar categoria para filtrar los gastos por categoría. Si no lo usas, se devolverán todos los gastos.

def get_gastos(categoria=None):
    with conecta_db() as conn:
        cursor = conn.cursor()
        query = 'SELECT * FROM gastos WHERE '
        condiciones, parametros = [], []

        if categoria:
            condiciones.append("categoria = ?")
            parametros.append(categoria)

        query += " AND ".join(condiciones) if condiciones else "1=1"

        cursor.execute(query, parametros)
        return cursor.fetchall()

Ahora vamos a crear nuestros gastos. Creamos la tabla y usamos la función add_gasto para añadir nuestros gastos.

crea_tabla()
add_gasto("Transporte", 5)
add_gasto("Comida", 5)
add_gasto("Comida", 7)
add_gasto("Alquiler", 300)

Comprobamos que han sido almacenados correctamente. Deberíamos obtener los mismos que hemos introducido.

gastos = get_gastos()
for gasto in gastos:
    print(gasto)

Consultamos todos los gastos de una categoría concreta.

gastos = get_gastos(categoria="Comida")
for gasto in gastos:
    print(gasto)

Como puedes ver tus gastos se persisten en el disco duro aunque tu código haya terminado.

✏️ Ejercicios:

  • Añade a la tabla gastos de tu base de datos un campo llamado fecha, que almacene cuando se realizó el gasto.
  • Añade a get_gastos la posibilidad de filtrar por fecha. Por ejemplo, los gastos de un mes concreto.
  • Añade todas las operaciones CRUD sobre la base de datos. Las operaciones CRUD son Create, Remove, Update y Delete. Tenemos add_gasto y get_gastos. Añade remove_gasto y update_gasto.