06 - SQLite Con Python
06 - SQLite Con Python
SQLite es una librería escrita en C, que implementa un motor de base de datos SQL
completo, pequeño, rápido, autocontenido y de alta confiabilidad. SQLite es el motor de
base de datos más utilizado a nivel mundial. SQLite esta disponible en todos los
teléfonos móviles del mundo y muchas computadoras y se encuentra embebido en
incontables aplicaciones de uso frecuente.
sqlite3
Esto retornará el prompt sqlite> donde se podrán introducír instrucciones SQL (solo
hay que recordar colocar ; al final de cada instrucción). Para conectarse a un archivo de
base de datos en este modo, hay que ejecutar:
Para salir:
sqlite> .quit
Enteros (INTEGER)
Reales (REAL)
Textos (TEXT)
Vacio (NULL)
Datos binarios grandes (BLOB)
Tampoco existe un tipo de datos para almacenar información de tiempo, por lo que se
requerirá TEXT o INTEGER (para almacenar UNIX time).
conn = sqlite3.connect(":memory:")
Si se quiere trabajar con esta tabla volatil, recuerde no ejecutar conn.close() ya que
estará cerrando la tabla y esto la eliminará de la memoria RAM.
In [29]: # Se insertan multiples valores en una tabla segun los datos contenidos en una l
conn = sqlite3.connect("database.db")
<class 'tuple'>
(1, 'Elvio Lado', 80, 1.72)
<class 'list'>
[(1, 'Elvio Lado', 80, 1.72), (2, 'Elsa Payo', 54, 1.65), (3, 'Armando Paredes',
88, 1.75), (4, 'Susana Oria', 48, 1.6), (5, 'Estaban Dido', 110, 1.68)]
La instrucción SQL SELECT se puede combinar con otras instrucción SQL para obtener
consultas complejas:
Actualización de un registro
Se puede actualizar los valor de un registro en la base de datos con la instrucción SQL
UPDATE . Note que la instrucción conn.commit() es importante ya que de no estar
presente, al cerrar la base de datos, la actualización no quedará registrada en el archivo
de datos.
# Consulta
cur.execute("SELECT * FROM pacientes")
for data in cur:
print("ID: {:<3} Nombre: {:16} Peso: {:3}kg Altura:{:.2f}m".format(*d
Eliminar un registro
Para eliminar un registro de la base da datos, se utiliza la instrucción SQL DELETE . Al
igual que en el caso anterior, se debe de confirmar la operación para que se haga
efectiva en el archivo de datos.
# Consulta
cur.execute("SELECT * FROM pacientes")
for data in cur:
print("ID: {:<3} Nombre: {:16} Peso: {:3}kg Altura:{:.2f}m".format(data
Rollback
Las operaciones de base de datos pueden retroceder hasta un punto de inicio,
deshaciendo todo lo hecho. A este proceso se le conoce como rollback. Este proceso
deshace todas las operaciones hechas hasta el inicio de la conexión o hasta el último
commit .
# Consulta
cur.execute("SELECT * FROM pacientes")
for data in cur:
print()
# Consulta
cur.execute("SELECT * FROM pacientes")
for data in cur:
print("ID: {:<3} Nombre: {:16} Peso: {:3}kg Altura:{:.2f}m".format(*dat
In [59]: try:
# Conectar a la base de datos
conn = sqlite3.connect("database.db")
cur = conn.cursor()
except sqlite3.IntegrityError:
conn.rollback()
print("ERROR: El 'id' ya existe en el registro. Los cambios no se guardan")
finally:
# Cerrar la conexion incondicionalmente
conn.close()
with conn:
cur = conn.cursor()
query = cur.execute("SELECT * FROM pacientes WHERE altura > 1.70")
rows = query.fetchall()
conn.close()
def __del__(self):
self.conn.close()
def nombres_pacientes(self):
return self.cur.execute("SELECT nombre FROM pacientes ORDER BY nombre").
def pacientes_altura_promedio(self):
return self.cur.execute("SELECT AVG(altura) FROM pacientes").fetchone()[
Una vez construida la clase, el script de la aplicación contiene solamente código Python,
lo que hace el código más légible y fácil de mantener.
In [112… db = Database()
print()
for idx, item in enumerate(db.nombres_pacientes(), start=1):
print(f"{idx} - {item[0]}")
print()
for idx, item in enumerate(db.pesos_pacientes(), start=1):
print(f"{idx} - {item[0]:20} {item[1]} kg")
print("\nAltura promedio:")
print(db.pacientes_altura_promedio(), "m")
del db
1 - Armando Paredes
2 - Elsa Payo
3 - Elvio Lado
4 - Susana Oria
1 - Susana Oria 48 kg
2 - Elsa Payo 54 kg
3 - Elvio Lado 88 kg
4 - Armando Paredes 88 kg
Altura promedio:
1.6800000000000002 m
Un ejemplo de esto es la interacción entre la clase Database y la clase App, de tal forma
que una aplicación GUI en tkinter, pueda utilizar los recursos de una base de datos por
medio de la clase Database.
class Database:
datafile = "database.db"
def __init__(self):
self.conn = sqlite3.connect(Database.datafile)
self.cur = self.conn.cursor()
def __del__(self):
self.conn.close()
def nombres_pacientes(self):
# Retorna una lista con los nombres de los pacientes (en orden alfabetic
data = self.cur.execute("SELECT nombre FROM pacientes ORDER BY nombre")
return [item[0] for item in data]
self.dB = Database()
self.var_nombre = tk.StringVar()
self.var_peso = tk.StringVar()
self.var_altura = tk.StringVar()
frm = tk.Frame(self)
frm1 = tk.Frame(frm)
frm2 = tk.Frame(frm)
frm.pack(padx=10, pady=10)
frm1.pack(side=tk.LEFT, padx=10, pady=10, anchor=tk.N)
frm2.pack(side=tk.LEFT, padx=10, pady=10)
self.cboNombres.bind("<<ComboboxSelected>>", self.name_selected)
self.var_nombre.set(name)
self.var_peso.set(peso)
self.var_altura.set(altura)
app = App().mainloop()