Vamos a usar la librería sqlite3
, que está instalada por defecto en Python.
import sqlite3
Ahora vamos a crear un conector.
conn = sqlite3.connect(':memory:')
Aquí trabajamos con una base de datos "temporal", cargada en memoria.
Si queremos trabajar en una base de datos concreta hacemos lo siguiente:
conn = sqlite3.connect('empleados.db')
(Si no está creada ya nos la crea)
c = conn.cursor()
Un string entre tres comillas
""" Hola
esto es un
string """
Es lo que se llama un docstring
y es un string que se puede escribir en varias líneas
docstring= """ Esto
es un
docstring.
Hola qué tal.
----Hola-----"""
print(docstring)
Vamos a crear una tabla:
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
En SQLite los tipos son distintos que en MySQL. https://www.sqlite.org/datatype3.html
conn.commit()
Cerramos el conector:
conn.close()
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
conn.commit()
conn.close()
Ahora vamos a añadir un empleado:
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("INSERT INTO empleados VALUES ('Juan','López',50000)")
conn.commit()
conn.close()
Vamos a hacer una consulta:
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("INSERT INTO empleados VALUES ('Juan','López',50000)")
conn.commit()
c.execute("SELECT * FROM empleados")
conn.close()
Para sacar el valor de la consulta usamos fetchone
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("INSERT INTO empleados VALUES ('Juan','López',50000)")
conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchone())
conn.close()
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("INSERT INTO empleados VALUES ('Juan','López',50000)")
#conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchone())
conn.close()
conn = sqlite3.connect('empleados3.db')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("INSERT INTO empleados VALUES ('Juan','López',50000)")
conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchone())
conn.close()
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("""INSERT INTO empleados VALUES
('Juan','López',50000),
('María', 'López', 40000),
('Pedro','Pérez', 30000),
('Eduardo','Campuzano', 10),
('Guillermo','Gallego',1000000000),
('Fulanito', 'de Tal', 100000000000)""")
conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchone()) # fetchone me saca uno solo
conn.close()
Si quiero sacar varios uso fetchmany
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("""INSERT INTO empleados VALUES
('Juan','López',50000),
('María', 'López', 40000),
('Pedro','Pérez', 30000),
('Eduardo','Campuzano', 10),
('Guillermo','Gallego',1000000000),
('Fulanito', 'de Tal', 100000000000)""")
conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchmany(5))
conn.close()
Si quiero sacar todos, uso fetchall
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("""INSERT INTO empleados VALUES
('Juan','López',50000),
('María', 'López', 40000),
('Pedro','Pérez', 30000),
('Eduardo','Campuzano', 10),
('Guillermo','Gallego',1000000000),
('Fulanito', 'de Tal', 100000000000)""")
conn.commit()
c.execute("SELECT * FROM empleados")
print(c.fetchall())
conn.close()
Puedo hacer consultas
conn = sqlite3.connect(':memory:')
c= conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)
""")
c.execute("""INSERT INTO empleados VALUES
('Juan','López',50000),
('María', 'López', 40000),
('Pedro','Pérez', 30000),
('Eduardo','Campuzano', 10),
('Guillermo','Gallego',1000000000),
('Fulanito', 'de Tal', 100000000000)""")
conn.commit()
c.execute("SELECT * FROM empleados WHERE apellido='López'")
print(c.fetchall())
conn.close()
Una forma interesante de interactuar con una base de datos es usando clases
class Empleado:
def __init__(self,nombre,apellido,sueldo):
self.nombre = nombre
self.apellido = apellido
self.sueldo = sueldo
conn = sqlite3.connect(':memory:')
c = conn.cursor()
emp1 = Empleado('Don', 'Nadie', 3000)
emp2 = Empleado('Doña', 'Nadie', 2000)
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)""")
print(emp1.nombre)
print(emp1.apellido)
print(emp1.sueldo)
# Introduzco valores en la tabla:
c.execute("INSERT INTO empleados VALUES (:nombre,:apellido,:sueldo)",
{'nombre':emp1.nombre, 'apellido':emp1.apellido, 'sueldo':emp1.sueldo})
conn.commit()
c.execute("INSERT INTO empleados VALUES (:nombre,:apellido,:sueldo)",
{'nombre':emp2.nombre, 'apellido':emp2.apellido, 'sueldo':emp2.sueldo})
conn.commit()
# Hago una consulta: (los que tengan el mismo apellido que emp1)
c.execute("SELECT * FROM empleados WHERE apellido = :apellido",{'apellido':emp1.apellido})
print(c.fetchall())
conn.commit()
conn.close()
Voy a definir unas funciones para automatizar estos procedimientos
Una función para insertar empleados:
def insert_emp(emp):
c.execute("INSERT INTO empleados VALUES (:nombre,:apellido,:sueldo)",
{'nombre':emp.nombre,'apellido':emp.apellido, 'sueldo':emp.sueldo})
Una función que haga una consulta de los empleados por apellido:
def get_emps_by_name(apellido):
c.execute("SELECT * FROM empleados WHERE apellido=:apellido", {'apellido':apellido})
return c.fetchall()
Una función para actualizar el sueldo de un empleado:
def update_pay(emp, sueldo):
emp.sueldo = sueldo
c.execute("""UPDATE empleados SET sueldo = :sueldo
WHERE nombre=:nombre AND apellido = :apellido""",
{'sueldo':emp.sueldo,'nombre': emp.nombre, 'apellido': emp.apellido})
Una función para eliminar a un empleado:
def remove_emp(emp):
c.execute("""DELETE FROM empleados WHERE nombre=:nombre AND apellido= :apellido""",
{'nombre':emp.nombre, 'apellido':emp.apellido})
Vamos a usar las funciones que hemos definido:
conn=sqlite3.connect(':memory:')
c=conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)""")
Me defino unos empleados:
emp0 = Empleado('Zutanito', 'Pérez', 10000)
lista_empleados = (Empleado('Juan','López',50000),
Empleado('María', 'López', 40000),
Empleado('Pedro','Pérez', 30000),
Empleado('Eduardo','Campuzano', 10),
Empleado('Guillermo','Gallego',1000000000),
Empleado('Fulanito', 'de Tal', 100000000000))
Los introduzco en la base de datos:
insert_emp(emp0)
conn.commit()
for emp in lista_empleados:
insert_emp(emp)
conn.commit()
consulta_empleados = get_emps_by_name('Pérez')
print(consulta_empleados)
consulta_empleados = get_emps_by_name('López')
print(consulta_empleados)
edu=lista_empleados[3]
update_pay(edu,3000000000)
consulta_empleados = get_emps_by_name('Campuzano')
print(consulta_empleados)
guille = lista_empleados[4]
guille.nombre
remove_emp(guille)
c.execute("SELECT * FROM empleados")
print(c.fetchall())
conn.close()
Para que lo saque "bonito" podemos usar el paquete tabulate
, que se instala con
pip install tabulate
from tabulate import tabulate
tabulate([('Alicia',24),('Bob',25)],headers=['Name','Age'], tablefmt='orgtbl')
print(tabulate([('Alicia',24),('Bob',25)],headers=['Name','Age'], tablefmt='orgtbl'))
conn=sqlite3.connect(':memory:')
c=conn.cursor()
c.execute("""CREATE TABLE empleados(
nombre text,
apellido text,
sueldo integer
)""")
lista_empleados = (Empleado('Juan','López',50000),
Empleado('María', 'López', 40000),
Empleado('Pedro','Pérez', 30000),
Empleado('Eduardo','Campuzano', 10),
Empleado('Guillermo','Gallego',1000000000),
Empleado('Fulanito', 'de Tal', 100000000000))
for emp in lista_empleados:
insert_emp(emp)
consulta=get_emps_by_name('López')
print(tabulate(consulta, headers=['Nombre', 'Apellido', 'Sueldo']))
print('\n')
update_pay(lista_empleados[1],90000)
remove_emp(lista_empleados[0])
consulta2 = get_emps_by_name('López')
print(tabulate(consulta2, headers=['Nombre', 'Apellido', 'Sueldo']))
conn.close()
from IPython.display import display, Markdown
display(Markdown(tabulate(consulta, headers=['Nombre', 'Apellido', 'Sueldo'], tablefmt='github')))