SQLite
SQLite es un motor de bases de datos SQL ligero, rápido y autónomo. Almacena toda la información (tablas, registros, etc.) en un único archivo con extensión .sql
.
Es el motor de bases de datos más usado en el mundo, integrado en todos los teléfonos móviles, la mayoría de los ordenadores y muchas aplicaciones.
Sus archivos son estables, funcionan en múltiples plataformas y conservan compatibilidad con versiones anteriores, con el compromiso de mantener estas cualidades hasta 2050. Se usan para transferir datos entre sistemas y como almacenamiento a largo plazo.
El código fuente de SQLite es de dominio público y puede usarse libremente para cualquier propósito.
CRUD
En este script vemos lo básico para interactuar con SQLite, lo que habitualmente se le conoce como CRUD (CREATE, READ, UPDATE, DELETE).
import sqlite3 # Importar la biblioteca
# Conectar a una base de datos (crea el archivo si no existe)
conn = sqlite3.connect("mi_base.db")
# Crear un cursor para ejecutar comandos SQL
cur = conn.cursor()
# Crear una tabla
cur.execute("""
CREATE TABLE IF NOT EXISTS usuarios (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL,
edad INTEGER
)
""")
# Insertar datos en la tabla
cur.execute("INSERT INTO usuarios (nombre, edad) VALUES (?, ?)", ("Alice", 30))
cur.execute("INSERT INTO usuarios (nombre, edad) VALUES (?, ?)", ("Bob", 25))
conn.commit() # Guardar los cambios
# Leer datos de la tabla
cur.execute("SELECT * FROM usuarios")
filas = cur.fetchall() # Obtener todos los resultados
print(filas) # [(1, 'Alice', 30), (2, 'Bob', 25)]
# Leer solo una fila
cur.execute("SELECT * FROM usuarios WHERE nombre = ?", ("Alice",))
fila = cur.fetchone()
print(fila) # (1, 'Alice', 30)
# Actualizar datos
cur.execute("UPDATE usuarios SET edad = ? WHERE nombre = ?", (31, "Alice"))
conn.commit() # Guardar cambios
# Eliminar un registro
cur.execute("DELETE FROM usuarios WHERE nombre = ?", ("Bob",))
conn.commit()
# Iterar sobre los resultados de una consulta
cur.execute("SELECT * FROM usuarios")
for fila in cur:
print(fila) # Muestra cada usuario línea por línea
# Cerrar cursor no es necesario, pero recomendable
cur.close()
# Cerrar conexión, es obligatorio
conn.close()
Es importante acordarse de cerrar tanto la connexión con la bbdd como el cursor, con el objetivo de evitar fugas de memoria. Tradicionalmente se realizaba de forma manual,
pero actualmente se puede aprovechar el contexto que ofrece with
y contextlib.closing
.
from contextlib import closing
with closing(sqlite3.connect("mi_base.db")) as connection:
with closing(connection.cursor()) as cursor:
rows = cursor.execute("SELECT `id`, `nombre`, `edad` FROM usuarios").fetchall()
print(rows)
# cursor.close() # es automático
# connection.close() # es automático