Solución Sesión ORMs#
Recordemos lo que es una base de datos#
Es un almacén o bóveda en donde el sistema guarda la información seleccionada por el usuario. Dicha información puede ser almacenada utilizando estructuras definidas, de manera que acceder a la información sea un proceso rápido dentro de la base de datos.

Tipos de bases de datos#

OJO: No es lo mismo una base de datos a un gestor de base de datos#
“Yo manejo bases de datos SQLsever”
“Yo sé oracle”
“Yo manejo bases de datos MongoDB”
“Yo sé MySQL”
Administrador de base de datos (Motor de base de datos)#

Diagrama ER (Entidad relación)#
El diagrama entidad relación nos permite tener una visión del relacionamiento y la cantidad de tablas que se utilizan para una aplicación.

Como llevamos esa información a nuestro desarrollo ?#
La información de las bases de datos se pueden obtener mediante un conector
Los conectores de bases de datos nos permiten conectarnos a la base de datos, estos transforman una cadena de texto con una instrucción (Consulta) para ser ejecutada en la base de datos y traer la información requerida.
Usemos SQL_lite como base de datos#

!ls -la
total 16
drwxr-xr-x 1 root root 4096 Feb 28 14:27 .
drwxr-xr-x 1 root root 4096 Mar 1 20:05 ..
drwxr-xr-x 4 root root 4096 Feb 28 14:26 .config
drwxr-xr-x 1 root root 4096 Feb 28 14:27 sample_data
import sqlite3
connection = sqlite3.connect("MiTiendaCom.db")
!ls -la
total 16
drwxr-xr-x 1 root root 4096 Mar 1 20:08 .
drwxr-xr-x 1 root root 4096 Mar 1 20:05 ..
drwxr-xr-x 4 root root 4096 Feb 28 14:26 .config
-rw-r--r-- 1 root root 0 Mar 1 20:08 MiTiendaCom.db
drwxr-xr-x 1 root root 4096 Feb 28 14:27 sample_data
# Creamos un cursor (instanciamos el objeto cursor)
c = connection.cursor()
c.execute("""
-- Crear la tabla de Clientes
CREATE TABLE Clientes (
ID_Cliente INTEGER PRIMARY KEY AUTOINCREMENT,
Nombre TEXT NOT NULL,
Apellido TEXT NOT NULL,
Email TEXT UNIQUE,
Telefono TEXT
);
""")
# Confirmar la ejecución
connection.commit()
!ls -la
total 32
drwxr-xr-x 1 root root 4096 Mar 1 20:09 .
drwxr-xr-x 1 root root 4096 Mar 1 20:05 ..
drwxr-xr-x 4 root root 4096 Feb 28 14:26 .config
-rw-r--r-- 1 root root 16384 Mar 1 20:09 MiTiendaCom.db
drwxr-xr-x 1 root root 4096 Feb 28 14:27 sample_data
from logging import exception
## Vamos a generar una función para terminar todo.
def get_connection():
return sqlite3.connect("MiTiendaCom.db")
def exec_instruction(cmd: str):
try:
conn = get_connection()
c = conn.cursor()
c.execute(cmd)
# Confirmar la ejecución
conn.commit()
conn.close()
print("Executed Succesfully")
except:
print("Error in query execution")
tabla1 = """-- Crear la tabla de Categorías
CREATE TABLE Categorias (
ID_Categoria INTEGER PRIMARY KEY AUTOINCREMENT,
Nombre TEXT NOT NULL UNIQUE
);"""
tabla2 = """-- Crear la tabla de Productos
CREATE TABLE Productos (
ID_Producto INTEGER PRIMARY KEY AUTOINCREMENT,
Nombre TEXT NOT NULL,
Precio REAL NOT NULL,
Cantidad INTEGER NOT NULL,
ID_Categoria INTEGER,
FOREIGN KEY (ID_Categoria) REFERENCES Categorias(ID_Categoria)
);"""
exec_instruction(tabla1)
exec_instruction(tabla2)
Executed Succesfully
Executed Succesfully
rest = """
-- Crear la tabla de Empleados
CREATE TABLE Empleados (
ID_Empleado INTEGER PRIMARY KEY AUTOINCREMENT,
Nombre TEXT NOT NULL,
Apellido TEXT NOT NULL,
Cargo TEXT NOT NULL
);
"""
rest1="""
-- Crear la tabla de Ventas
CREATE TABLE Ventas (
ID_Venta INTEGER PRIMARY KEY AUTOINCREMENT,
Fecha DATE NOT NULL,
ID_Cliente INTEGER,
ID_Empleado INTEGER,
FOREIGN KEY (ID_Cliente) REFERENCES Clientes(ID_Cliente),
FOREIGN KEY (ID_Empleado) REFERENCES Empleados(ID_Empleado)
);
"""
rest2 = """
-- Crear la tabla de DetallesVenta
CREATE TABLE DetallesVenta (
ID_Detalle INTEGER PRIMARY KEY AUTOINCREMENT,
ID_Venta INTEGER,
ID_Producto INTEGER,
Cantidad INTEGER NOT NULL,
Precio_Unitario REAL NOT NULL,
FOREIGN KEY (ID_Venta) REFERENCES Ventas(ID_Venta),
FOREIGN KEY (ID_Producto) REFERENCES Productos(ID_Producto)
);
"""
exec_instruction(rest)
exec_instruction(rest1)
exec_instruction(rest2)
Executed Succesfully
Executed Succesfully
Executed Succesfully
Como insertar data? … Con comando SQL#
Ojo ver el poco control que tenemos sobre la sintaxis
insert = """
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono) VALUES
('Juan', 'Pérez', 'juan.perez@email.com', '1234567890'),
"""
exec_instruction(insert)
Error in query execution
insert = """
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono) VALUES
('Juan', 'Pérez', 'juan.perez@email.com', '1234567890')
"""
exec_instruction(insert)
Executed Succesfully
Vamos a automatizar la populada de los datos#
# Usemos el execute many
# c.executemany(Query,list_values)
def exec_instruction(cmd: str, many:bool=False,list_rec=[]):
try:
conn = get_connection()
c = conn.cursor()
if many:
c.executemany(cmd,list_rec)
else:
c.execute(cmd)
# Confirmar la ejecución
conn.commit()
conn.close()
print("Executed Succesfully")
except:
print("Error in query execution")
# @title Datos de clientes ... (clientes)
clientes = [
('Ana', 'García', 'ana.garcia@email.com', '0987654321'),
('Luis', 'Martínez', 'luis.martinez@email.com', '1122334455'),
('Sofía', 'Rodríguez', 'sofia.rodriguez@email.com', '2233445566'),
('Carlos', 'López', 'carlos.lopez@email.com', '3344556677'),
('María', 'González', 'maria.gonzalez@email.com', '4455667788'),
('David', 'Fernández', 'david.fernandez@email.com', '5566778899'),
('Laura', 'Ruiz', 'laura.ruiz@email.com', '6677889900'),
('Daniel', 'Ramírez', 'daniel.ramirez@email.com', '7788990011'),
('Elena', 'Morales', 'elena.morales@email.com', '8899001122'),
('Javier', 'Ortega', 'javier.ortega@email.com', '9900112233'),
('Sara', 'Gutiérrez', 'sara.gutierrez@email.com', '0011223344'),
('Pablo', 'Romero', 'pablo.romero@email.com', '1122334455'),
('Marta', 'Sánchez', 'marta.sanchez@email.com', '2233445566'),
('José', 'Torres', 'jose.torres@email.com', '3344556677'),
('Andrea', 'Giménez', 'andrea.gimenez@email.com', '4455667788'),
('Jorge', 'Vázquez', 'jorge.vazquez@email.com', '5566778899'),
('Mónica', 'Castro', 'monica.castro@email.com', '6677889900'),
('Diego', 'Serrano', 'diego.serrano@email.com', '7788990011'),
('Cristina', 'Guerrero', 'cristina.guerrero@email.com', '8899001122'),
('Rubén', 'Molina', 'ruben.molina@email.com', '9900112233'),
('Isabel', 'Delgado', 'isabel.delgado@email.com', '0011223344'),
('Álvaro', 'Marín', 'alvaro.marin@email.com', '1122334455'),
('Irene', 'Núñez', 'irene.nunez@email.com', '2233445566'),
('Ricardo', 'Medina', 'ricardo.medina@email.com', '3344556677'),
('Susana', 'Herrera', 'susana.herrera@email.com', '4455667788'),
('Mario', 'Domínguez', 'mario.dominguez@email.com', '5566778899'),
('Silvia', 'Reyes', 'silvia.reyes@email.com', '6677889900'),
('Marcos', 'Fuentes', 'marcos.fuentes@email.com', '7788990011'),
('Natalia', 'Cabrera', 'natalia.cabrera@email.com', '8899001122')
]
# OJO: LOS COMANDOS ACÁ SON CASE SENSITIVE
query_clientes = """
INSERT INTO Clientes (Nombre, Apellido, Email, Telefono) VALUES (?,?,?,?)
"""
exec_instruction(query_clientes, many=True, list_rec=clientes)
Executed Succesfully
# @title Datos de las categorías ... (categorias)
categorias = [
('Electrónicos',),
('Ropa',),
('Alimentos',),
('Juguetes',),
('Muebles',),
('Libros',),
('Deportes',),
('Jardín',),
('Automóviles',),
('Belleza',),
('Salud',),
('Mascotas',),
('Oficina',),
('Hogar',),
('Arte',),
('Música',),
('Películas',),
('Videojuegos',),
('Fotografía',),
('Computadoras',),
('Teléfonos',),
('Accesorios',),
('Calzado',),
('Joyas',),
('Relojes',),
('Instrumentos Musicales',),
('Equipo de Sonido',),
('Herramientas',),
('Bebés',),
('Adultos',),
('Otros',)
]
# Tu código acá ...
query_categorias = """
INSERT INTO Categorias (Nombre) VALUES (?)
"""
exec_instruction(query_categorias, many=True, list_rec=categorias)
Executed Succesfully
# @title Datos de productos ... (productos)
productos = [
('Televisor', 500.00, 10, 1),
('Camisa', 20.00, 50, 2),
('Manzana', 1.00, 100, 3),
('Pelota', 5.00, 40, 4),
('Sofá', 300.00, 5, 5),
('Libro', 10.00, 30, 6),
('Bicicleta', 100.00, 15, 7),
('Maceta', 8.00, 20, 8),
('Aceite de motor', 12.00, 25, 9),
('Crema facial', 15.00, 60, 10),
('Vitamina C', 7.00, 50, 11),
('Comida para perro', 20.00, 30, 12),
('Silla de oficina', 80.00, 10, 13),
('Lámpara', 25.00, 20, 14),
('Cuadro', 50.00, 10, 15),
('Guitarra', 200.00, 5, 16),
('DVD de película', 5.00, 100, 17),
('Videojuego', 60.00, 20, 18),
('Cámara', 300.00, 8, 19),
('Laptop', 800.00, 10, 20),
('Smartphone', 700.00, 15, 21),
('Mochila', 30.00, 25, 22),
('Zapatos', 40.00, 30, 23),
('Collar', 100.00, 10, 24),
('Reloj', 150.00, 12, 25),
('Piano', 1000.00, 2, 26),
('Altavoces', 50.00, 20, 27),
('Taladro', 70.00, 15, 28),
('Pañales', 25.00, 40, 29),
('Juguete para adultos', 50.00, 20, 30)
]
# Tu código acá ...
query_productos = """
INSERT INTO Productos (Nombre, Precio, Cantidad, ID_Categoria) VALUES (?,?,?,?)
"""
exec_instruction(query_productos, many=True, list_rec=productos)
Executed Succesfully
# @title Datos de empleados ... (empleados)
empleados = [
('Carlos', 'Rodríguez', 'Vendedor'),
('María', 'López', 'Gerente'),
('Pedro', 'González', 'Cajero'),
('Lucía', 'Martínez', 'Vendedor'),
('Fernando', 'García', 'Almacenero'),
('Carmen', 'Pérez', 'Vendedor'),
('Antonio', 'Sánchez', 'Cajero'),
('Miguel', 'Gómez', 'Vendedor'),
('Rosa', 'Ruiz', 'Almacenero'),
('Francisco', 'Hernández', 'Vendedor'),
('Raquel', 'Jiménez', 'Cajero'),
('Sergio', 'Díaz', 'Vendedor'),
('Isabel', 'Álvarez', 'Almacenero'),
('Alejandro', 'Moreno', 'Vendedor'),
('Esther', 'Muñoz', 'Cajero'),
('Joaquín', 'Romero', 'Vendedor'),
('Pilar', 'Alonso', 'Almacenero'),
('Andrés', 'Gutiérrez', 'Vendedor'),
('Irene', 'Torres', 'Cajero'),
('Javier', 'Domínguez', 'Vendedor'),
('Teresa', 'Serrano', 'Almacenero'),
('Rafael', 'Ramos', 'Vendedor'),
('Lorena', 'Blanco', 'Cajero'),
('Enrique', 'Medina', 'Vendedor'),
('Sonia', 'Castro', 'Almacenero'),
('Víctor', 'Ortega', 'Vendedor'),
('Laura', 'Cano', 'Cajero'),
('Alberto', 'Santos', 'Vendedor'),
('Alicia', 'Navarro', 'Almacenero'),
('Roberto', 'Gil', 'Vendedor')
]
# Tu código acá ...
query_empleados = """
INSERT INTO Empleados (Nombre, Apellido, Cargo) VALUES (?,?,?)
"""
exec_instruction(query_empleados, many=True, list_rec=empleados)
Executed Succesfully
# @title datos de ventas ... (ventas)
ventas = [
('2023-09-01', 1, 1),
('2023-09-02', 2, 1),
('2023-09-03', 2, 3),
('2023-09-04', 4, 1),
('2023-09-05', 2, 5),
('2023-09-06', 1, 6),
('2023-09-07', 7, 7),
('2023-09-08', 8, 8),
('2023-09-09', 1, 9),
('2023-09-10', 10, 10),
('2023-09-11', 11, 1),
('2023-09-12', 1, 12),
('2023-09-13', 13, 1),
('2023-09-14', 1, 14),
('2023-09-15', 15, 15),
('2023-09-16', 1, 3),
('2023-09-17', 17, 17),
('2023-09-18', 1, 18),
('2023-09-19', 1, 3),
('2023-09-20', 20, 20),
('2023-09-21', 21, 2),
('2023-09-22', 1, 22),
('2023-09-23', 23, 23),
('2023-09-24', 2, 24),
('2023-09-25', 2, 25),
('2023-09-26', 2, 26),
('2023-09-27', 27, 27),
('2023-09-28', 28, 3),
('2023-09-29', 2, 4),
('2023-09-30', 30, 3)
]
# Tu código acá ...
query_ventas = """
INSERT INTO Ventas (Fecha, ID_Cliente, ID_Empleado) VALUES (?,?,?)
"""
exec_instruction(query_ventas, many=True, list_rec=ventas)
Executed Succesfully
# @title Datos de detalles de venta ... (detalles_venta)
detalles_venta = [
(1, 1, 2, 500.00),
(2, 2, 5, 20.00),
(3, 3, 10, 1.00),
(4, 4, 1, 5.00),
(5, 5, 1, 300.00),
(6, 6, 3, 10.00),
(7, 7, 1, 100.00),
(8, 8, 2, 8.00),
(9, 9, 1, 12.00),
(10, 10, 4, 15.00),
(11, 11, 2, 7.00),
(12, 12, 1, 20.00),
(13, 13, 1, 80.00),
(14, 14, 1, 25.00),
(15, 15, 1, 50.00),
(16, 16, 1, 200.00),
(17, 17, 5, 5.00),
(18, 18, 1, 60.00),
(19, 19, 1, 300.00),
(20, 20, 1, 800.00),
(21, 21, 1, 700.00),
(22, 22, 1, 30.00),
(23, 23, 1, 40.00),
(24, 24, 1, 100.00),
(25, 25, 1, 150.00),
(26, 26, 1, 1000.00),
(27, 27, 2, 50.00),
(28, 28, 1, 70.00),
(29, 29, 2, 25.00),
(30, 30, 1, 50.00)
]
# Tu código acá ...
query_detalles_venta = """
INSERT INTO DetallesVenta (ID_Venta, ID_Producto, Cantidad, Precio_Unitario) VALUES (?,?,?,?)
"""
exec_instruction(query_detalles_venta, many=True, list_rec=detalles_venta)
Executed Succesfully
Ahora revisemos como extraer datos de la base de datos#
# Llamemos nuestra función con la conexión
conn = get_connection()
cur = conn.cursor()
# El resultado de una ejecución de execute se puede iterar
consulta = cur.execute('SELECT * FROM Categorias;')
for row in consulta:
print(row)
# Segurate siempre de cerrar la conexión para que no existan concflictos ... ahora no es tan importante pero más adelante en el curso tomara sentido
conn.close()
(1, 'Electrónicos')
(2, 'Ropa')
(3, 'Alimentos')
(4, 'Juguetes')
(5, 'Muebles')
(6, 'Libros')
(7, 'Deportes')
(8, 'Jardín')
(9, 'Automóviles')
(10, 'Belleza')
(11, 'Salud')
(12, 'Mascotas')
(13, 'Oficina')
(14, 'Hogar')
(15, 'Arte')
(16, 'Música')
(17, 'Películas')
(18, 'Videojuegos')
(19, 'Fotografía')
(20, 'Computadoras')
(21, 'Teléfonos')
(22, 'Accesorios')
(23, 'Calzado')
(24, 'Joyas')
(25, 'Relojes')
(26, 'Instrumentos Musicales')
(27, 'Equipo de Sonido')
(28, 'Herramientas')
(29, 'Bebés')
(30, 'Adultos')
(31, 'Otros')
# Hagamos una query un poco más avanzada: veamos los vendedores que más han facturado para la empresa
query = """
SELECT
Empleados.ID_Empleado,
Empleados.Nombre || ' ' || Empleados.Apellido AS NombreCompleto,
SUM(DetallesVenta.Cantidad * DetallesVenta.Precio_Unitario) AS TotalVentas
FROM
Empleados
JOIN
Ventas ON Empleados.ID_Empleado = Ventas.ID_Empleado
JOIN
DetallesVenta ON Ventas.ID_Venta = DetallesVenta.ID_Venta
GROUP BY
Empleados.ID_Empleado
ORDER BY
TotalVentas DESC
"""
conn = get_connection()
cur = conn.cursor()
for row in cur.execute(query):
print(row)
conn.close()
(1, 'Carlos Rodríguez', 1199.0)
(26, 'Víctor Ortega', 1000.0)
(20, 'Javier Domínguez', 800.0)
(2, 'María López', 700.0)
(3, 'Pedro González', 630.0)
(5, 'Fernando García', 300.0)
(25, 'Sonia Castro', 150.0)
(27, 'Laura Cano', 100.0)
(24, 'Enrique Medina', 100.0)
(7, 'Antonio Sánchez', 100.0)
(18, 'Andrés Gutiérrez', 60.0)
(10, 'Francisco Hernández', 60.0)
(15, 'Esther Muñoz', 50.0)
(4, 'Lucía Martínez', 50.0)
(23, 'Lorena Blanco', 40.0)
(22, 'Rafael Ramos', 30.0)
(6, 'Carmen Pérez', 30.0)
(17, 'Pilar Alonso', 25.0)
(14, 'Alejandro Moreno', 25.0)
(12, 'Sergio Díaz', 20.0)
(8, 'Miguel Gómez', 16.0)
(9, 'Rosa Ruiz', 12.0)
Ahora respondamos algo…#
“¿Cuál es el producto más vendido y cuántas unidades de ese producto se han vendido?”
# "¿Cuál es el producto más vendido y cuántas unidades de ese producto se han vendido?"
# Tu Código acá ...
query_producto_mas_vendido = """
SELECT
Productos.ID_Producto,
Productos.Nombre,
SUM(DetallesVenta.Cantidad) AS UnidadesVendidas
FROM
Productos
JOIN
DetallesVenta ON Productos.ID_Producto = DetallesVenta.ID_Producto
GROUP BY
Productos.ID_Producto
ORDER BY
UnidadesVendidas DESC
LIMIT 1;
"""
conn = get_connection()
cur = conn.cursor()
for row in cur.execute(query_producto_mas_vendido):
print(row)
conn.close()
(3, 'Manzana', 10)
Fetch all / Fetch one#
conn = get_connection()
cur = conn.cursor()
cur.execute(query)
print(cur.fetchone())
conn.close()
(1, 'Carlos Rodríguez', 1199.0)
conn = get_connection()
cur = conn.cursor()
cur.execute(query)
print(cur.fetchall(), "\n ", type(cur.fetchall()))
conn.close()
[(1, 'Carlos Rodríguez', 1199.0), (26, 'Víctor Ortega', 1000.0), (20, 'Javier Domínguez', 800.0), (2, 'María López', 700.0), (3, 'Pedro González', 630.0), (5, 'Fernando García', 300.0), (25, 'Sonia Castro', 150.0), (27, 'Laura Cano', 100.0), (24, 'Enrique Medina', 100.0), (7, 'Antonio Sánchez', 100.0), (18, 'Andrés Gutiérrez', 60.0), (10, 'Francisco Hernández', 60.0), (15, 'Esther Muñoz', 50.0), (4, 'Lucía Martínez', 50.0), (23, 'Lorena Blanco', 40.0), (22, 'Rafael Ramos', 30.0), (6, 'Carmen Pérez', 30.0), (17, 'Pilar Alonso', 25.0), (14, 'Alejandro Moreno', 25.0), (12, 'Sergio Díaz', 20.0), (8, 'Miguel Gómez', 16.0), (9, 'Rosa Ruiz', 12.0)]
<class 'list'>
Pandas para acceso a la información#
import pandas as pd
import sqlite3
# Primero debemos tenter la conección a la base de datos
con = sqlite3.connect("MiTiendaCom.db")
df = pd.read_sql_query("SELECT * from Empleados", con)
con.close()
# Verifiquemos el resultado de la query
print(type(df))
df.head()
<class 'pandas.core.frame.DataFrame'>
ID_Empleado | Nombre | Apellido | Cargo | |
---|---|---|---|---|
0 | 1 | Carlos | Rodríguez | Vendedor |
1 | 2 | María | López | Gerente |
2 | 3 | Pedro | González | Cajero |
3 | 4 | Lucía | Martínez | Vendedor |
4 | 5 | Fernando | García | Almacenero |
import pandas as pd
import sqlite3
# Primero debemos tenter la conección a la base de datos
con = sqlite3.connect("MiTiendaCom.db")
df = pd.read_sql_query(query, con)
con.close()
# Verifiquemos el resultado de la query
print(type(df))
df.head()
<class 'pandas.core.frame.DataFrame'>
ID_Empleado | NombreCompleto | TotalVentas | |
---|---|---|---|
0 | 1 | Carlos Rodríguez | 1199.0 |
1 | 26 | Víctor Ortega | 1000.0 |
2 | 20 | Javier Domínguez | 800.0 |
3 | 2 | María López | 700.0 |
4 | 3 | Pedro González | 630.0 |
Guardemos los datos procesados con pandas en una tabla nueva#
import pandas as pd
import sqlite3
con = sqlite3.connect("MiTiendaCom.db")
# Cargamos la data en un dataframe
surveys_df = pd.read_sql_query(query, con)
# Escribe el nuevo DataFrame a una nueva tabla en SQLite
surveys_df.to_sql("TopSales", con, if_exists="replace")
con.close()
# Verifiquemos que la nueva tabla exista dentro de la base de datos...
# Tu código acá ...
import pandas as pd
import sqlite3
con = sqlite3.connect("MiTiendaCom.db")
result_df = pd.read_sql_query("SELECT * FROM TopSales", con)
result_df
index | ID_Empleado | NombreCompleto | TotalVentas | |
---|---|---|---|---|
0 | 0 | 1 | Carlos Rodríguez | 1199.0 |
1 | 1 | 26 | Víctor Ortega | 1000.0 |
2 | 2 | 20 | Javier Domínguez | 800.0 |
3 | 3 | 2 | María López | 700.0 |
4 | 4 | 3 | Pedro González | 630.0 |
5 | 5 | 5 | Fernando García | 300.0 |
6 | 6 | 25 | Sonia Castro | 150.0 |
7 | 7 | 27 | Laura Cano | 100.0 |
8 | 8 | 24 | Enrique Medina | 100.0 |
9 | 9 | 7 | Antonio Sánchez | 100.0 |
10 | 10 | 18 | Andrés Gutiérrez | 60.0 |
11 | 11 | 10 | Francisco Hernández | 60.0 |
12 | 12 | 15 | Esther Muñoz | 50.0 |
13 | 13 | 4 | Lucía Martínez | 50.0 |
14 | 14 | 23 | Lorena Blanco | 40.0 |
15 | 15 | 22 | Rafael Ramos | 30.0 |
16 | 16 | 6 | Carmen Pérez | 30.0 |
17 | 17 | 17 | Pilar Alonso | 25.0 |
18 | 18 | 14 | Alejandro Moreno | 25.0 |
19 | 19 | 12 | Sergio Díaz | 20.0 |
20 | 20 | 8 | Miguel Gómez | 16.0 |
21 | 21 | 9 | Rosa Ruiz | 12.0 |
Revisemos ahora como agregar registros nuevos con pandas…#
Para esto:
Creamos la conexión
Traemos con pandas todos los datos de la tabla Empleados
Eliminamos la columna de los ID porque son autoincrementales
Concatenamos los datos nuevos
Sobreescribimos los datos de toda la tabla enviandole el dataframe editado
OJO con el idex de pandas, este no lo debemos pasar a la base de datos.
Vamos a realizar este ejercicio …
# Tu código acá ...
import pandas as pd
import sqlite3
# Nuevos datos para agregar
nuevos_empleados = pd.DataFrame({
'Nombre': ['Reinel', 'Johan'],
'Apellido': ['Tabares', 'Piña'],
'Cargo': ['Docente', 'Monitor']
})
nuevos_empleados
Nombre | Apellido | Cargo | |
---|---|---|---|
0 | Reinel | Tabares | Docente |
1 | Johan | Piña | Monitor |
# Crear la conexión a la base de datos
con = sqlite3.connect("MiTiendaCom.db")
# Traer los datos actuales de la tabla Empleados
df_empleados = pd.read_sql_query("SELECT * from Empleados", con)
df_empleados
ID_Empleado | Nombre | Apellido | Cargo | |
---|---|---|---|---|
0 | 1 | Carlos | Rodríguez | Vendedor |
1 | 2 | María | López | Gerente |
2 | 3 | Pedro | González | Cajero |
3 | 4 | Lucía | Martínez | Vendedor |
4 | 5 | Fernando | García | Almacenero |
5 | 6 | Carmen | Pérez | Vendedor |
6 | 7 | Antonio | Sánchez | Cajero |
7 | 8 | Miguel | Gómez | Vendedor |
8 | 9 | Rosa | Ruiz | Almacenero |
9 | 10 | Francisco | Hernández | Vendedor |
10 | 11 | Raquel | Jiménez | Cajero |
11 | 12 | Sergio | Díaz | Vendedor |
12 | 13 | Isabel | Álvarez | Almacenero |
13 | 14 | Alejandro | Moreno | Vendedor |
14 | 15 | Esther | Muñoz | Cajero |
15 | 16 | Joaquín | Romero | Vendedor |
16 | 17 | Pilar | Alonso | Almacenero |
17 | 18 | Andrés | Gutiérrez | Vendedor |
18 | 19 | Irene | Torres | Cajero |
19 | 20 | Javier | Domínguez | Vendedor |
20 | 21 | Teresa | Serrano | Almacenero |
21 | 22 | Rafael | Ramos | Vendedor |
22 | 23 | Lorena | Blanco | Cajero |
23 | 24 | Enrique | Medina | Vendedor |
24 | 25 | Sonia | Castro | Almacenero |
25 | 26 | Víctor | Ortega | Vendedor |
26 | 27 | Laura | Cano | Cajero |
27 | 28 | Alberto | Santos | Vendedor |
28 | 29 | Alicia | Navarro | Almacenero |
29 | 30 | Roberto | Gil | Vendedor |
# Eliminar la columna de ID de los datos actuales, ya que son autoincrementables
df_empleados.drop('ID_Empleado', axis=1, inplace=True)
df_empleados
Nombre | Apellido | Cargo | |
---|---|---|---|
0 | Carlos | Rodríguez | Vendedor |
1 | María | López | Gerente |
2 | Pedro | González | Cajero |
3 | Lucía | Martínez | Vendedor |
4 | Fernando | García | Almacenero |
5 | Carmen | Pérez | Vendedor |
6 | Antonio | Sánchez | Cajero |
7 | Miguel | Gómez | Vendedor |
8 | Rosa | Ruiz | Almacenero |
9 | Francisco | Hernández | Vendedor |
10 | Raquel | Jiménez | Cajero |
11 | Sergio | Díaz | Vendedor |
12 | Isabel | Álvarez | Almacenero |
13 | Alejandro | Moreno | Vendedor |
14 | Esther | Muñoz | Cajero |
15 | Joaquín | Romero | Vendedor |
16 | Pilar | Alonso | Almacenero |
17 | Andrés | Gutiérrez | Vendedor |
18 | Irene | Torres | Cajero |
19 | Javier | Domínguez | Vendedor |
20 | Teresa | Serrano | Almacenero |
21 | Rafael | Ramos | Vendedor |
22 | Lorena | Blanco | Cajero |
23 | Enrique | Medina | Vendedor |
24 | Sonia | Castro | Almacenero |
25 | Víctor | Ortega | Vendedor |
26 | Laura | Cano | Cajero |
27 | Alberto | Santos | Vendedor |
28 | Alicia | Navarro | Almacenero |
29 | Roberto | Gil | Vendedor |
# Concatenar los nuevos datos al DataFrame existente
df_empleados_actualizado = pd.concat([df_empleados, nuevos_empleados], ignore_index=True)
df_empleados_actualizado
Nombre | Apellido | Cargo | |
---|---|---|---|
0 | Carlos | Rodríguez | Vendedor |
1 | María | López | Gerente |
2 | Pedro | González | Cajero |
3 | Lucía | Martínez | Vendedor |
4 | Fernando | García | Almacenero |
5 | Carmen | Pérez | Vendedor |
6 | Antonio | Sánchez | Cajero |
7 | Miguel | Gómez | Vendedor |
8 | Rosa | Ruiz | Almacenero |
9 | Francisco | Hernández | Vendedor |
10 | Raquel | Jiménez | Cajero |
11 | Sergio | Díaz | Vendedor |
12 | Isabel | Álvarez | Almacenero |
13 | Alejandro | Moreno | Vendedor |
14 | Esther | Muñoz | Cajero |
15 | Joaquín | Romero | Vendedor |
16 | Pilar | Alonso | Almacenero |
17 | Andrés | Gutiérrez | Vendedor |
18 | Irene | Torres | Cajero |
19 | Javier | Domínguez | Vendedor |
20 | Teresa | Serrano | Almacenero |
21 | Rafael | Ramos | Vendedor |
22 | Lorena | Blanco | Cajero |
23 | Enrique | Medina | Vendedor |
24 | Sonia | Castro | Almacenero |
25 | Víctor | Ortega | Vendedor |
26 | Laura | Cano | Cajero |
27 | Alberto | Santos | Vendedor |
28 | Alicia | Navarro | Almacenero |
29 | Roberto | Gil | Vendedor |
30 | Reinel | Tabares | Docente |
31 | Johan | Piña | Monitor |
df_empleados_actualizado.to_sql('Empleados', con, if_exists='append', index=False, method='multi')
# Cerrar la conexión
con.close()
# Crear la conexión a la base de datos
con = sqlite3.connect("MiTiendaCom.db")
# Traer los datos actuales de la tabla Empleados
df_empleados = pd.read_sql_query("SELECT * from Empleados", con)
df_empleados
ID_Empleado | Nombre | Apellido | Cargo | |
---|---|---|---|---|
0 | 1 | Carlos | Rodríguez | Vendedor |
1 | 2 | María | López | Gerente |
2 | 3 | Pedro | González | Cajero |
3 | 4 | Lucía | Martínez | Vendedor |
4 | 5 | Fernando | García | Almacenero |
... | ... | ... | ... | ... |
57 | 58 | Alberto | Santos | Vendedor |
58 | 59 | Alicia | Navarro | Almacenero |
59 | 60 | Roberto | Gil | Vendedor |
60 | 61 | Reinel | Tabares | Docente |
61 | 62 | Johan | Piña | Monitor |
62 rows × 4 columns
Hablemos de los ORM’s#
Un Object-Relational Mapping (ORM) es una técnica que permite interactuar con una base de datos relacional de una manera orientada a objetos. Uno de los ORM más populares para Python es SQLAlchemy. A continuación, te muestro un ejemplo simple de cómo usar SQLAlchemy para modelar una tienda con empleados y productos.

!pip install sqlalchemy
Requirement already satisfied: sqlalchemy in /usr/local/lib/python3.10/dist-packages (2.0.27)
Requirement already satisfied: typing-extensions>=4.6.0 in /usr/local/lib/python3.10/dist-packages (from sqlalchemy) (4.10.0)
Requirement already satisfied: greenlet!=0.4.17 in /usr/local/lib/python3.10/dist-packages (from sqlalchemy) (3.0.3)
Ejemplo de ORM en Python#
OJO Este ejemplo puede que no funcione acá… es solo para ilustrar los conceptos que profundizaremos en una próxima sesión…
from sqlalchemy import Column, Integer, String, Float, Date, ForeignKey
from sqlalchemy.orm import declarative_base, relationship
Base = declarative_base()
class Cliente(Base):
__tablename__ = 'Clientes'
ID_Cliente = Column(Integer, primary_key=True)
Nombre = Column(String)
Apellido = Column(String)
Email = Column(String, unique=True)
Telefono = Column(String)
class Categoria(Base):
__tablename__ = 'Categorias'
ID_Categoria = Column(Integer, primary_key=True)
Nombre = Column(String, unique=True)
class Producto(Base):
__tablename__ = 'Productos'
ID_Producto = Column(Integer, primary_key=True)
Nombre = Column(String)
Precio = Column(Float)
Cantidad = Column(Integer)
ID_Categoria = Column(Integer, ForeignKey('Categorias.ID_Categoria'))
categoria = relationship("Categoria")
class Empleado(Base):
__tablename__ = 'Empleados'
ID_Empleado = Column(Integer, primary_key=True)
Nombre = Column(String)
Apellido = Column(String)
Cargo = Column(String)
class Venta(Base):
__tablename__ = 'Ventas'
ID_Venta = Column(Integer, primary_key=True)
Fecha = Column(Date)
ID_Cliente = Column(Integer, ForeignKey('Clientes.ID_Cliente'))
ID_Empleado = Column(Integer, ForeignKey('Empleados.ID_Empleado'))
cliente = relationship("Cliente")
empleado = relationship("Empleado")
class DetalleVenta(Base):
__tablename__ = 'DetallesVenta'
ID_Detalle = Column(Integer, primary_key=True)
ID_Venta = Column(Integer, ForeignKey('Ventas.ID_Venta'))
ID_Producto = Column(Integer, ForeignKey('Productos.ID_Producto'))
Cantidad = Column(Integer)
Precio_Unitario = Column(Float)
venta = relationship("Venta")
producto = relationship("Producto")
from sqlalchemy import create_engine
engine = create_engine('sqlite:///MiTiendaCom.db')
Base.metadata.create_all(engine) # Este comando es el que realiza la mágia
Realizar consultas#
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
# El siguiente comando parece redundate pero realmente esto se instancia en otro archivo.
session = Session()
clientes = session.query(Cliente).all()
for cliente in clientes:
print(cliente.Email, cliente.Nombre, cliente.Apellido)
juan.perez@email.com Juan Pérez
ana.garcia@email.com Ana García
luis.martinez@email.com Luis Martínez
sofia.rodriguez@email.com Sofía Rodríguez
carlos.lopez@email.com Carlos López
maria.gonzalez@email.com María González
david.fernandez@email.com David Fernández
laura.ruiz@email.com Laura Ruiz
daniel.ramirez@email.com Daniel Ramírez
elena.morales@email.com Elena Morales
javier.ortega@email.com Javier Ortega
sara.gutierrez@email.com Sara Gutiérrez
pablo.romero@email.com Pablo Romero
marta.sanchez@email.com Marta Sánchez
jose.torres@email.com José Torres
andrea.gimenez@email.com Andrea Giménez
jorge.vazquez@email.com Jorge Vázquez
monica.castro@email.com Mónica Castro
diego.serrano@email.com Diego Serrano
cristina.guerrero@email.com Cristina Guerrero
ruben.molina@email.com Rubén Molina
isabel.delgado@email.com Isabel Delgado
alvaro.marin@email.com Álvaro Marín
irene.nunez@email.com Irene Núñez
ricardo.medina@email.com Ricardo Medina
susana.herrera@email.com Susana Herrera
mario.dominguez@email.com Mario Domínguez
silvia.reyes@email.com Silvia Reyes
marcos.fuentes@email.com Marcos Fuentes
natalia.cabrera@email.com Natalia Cabrera
nuevo_cliente = Cliente(Nombre='Test', Apellido='User', Email='test.user@email.com', Telefono='1234567890')
session.add(nuevo_cliente)
nuevo_empleado = Empleado(Nombre="Fulanito", Apellido="Detal",Cargo='Gerente')
session.add(nuevo_empleado)
session.commit()
# Datos del nuevo cliente
request = {
'Nombre': 'Laura',
'Apellido': 'Pérez',
'Email': 'laura.perez@mail.com',
'Telefono': '9876543210'
}
# Creación del objeto Cliente utilizando **kwargs
nuevo_cliente = Cliente(**request)
# Agregar el nuevo cliente a la sesión y confirmar los cambios
session.add(nuevo_cliente)
session.commit()
print(f"Cliente agregado: {nuevo_cliente.Nombre} {nuevo_cliente.Apellido}")
Cliente agregado: Laura Pérez
# Ahora miremos una de las ventajas del ORM para traer información
ventas = session.query(Venta).all()
print(ventas)
[<__main__.Venta object at 0x7f0caf894b50>, <__main__.Venta object at 0x7f0caf894430>, <__main__.Venta object at 0x7f0caf897640>, <__main__.Venta object at 0x7f0caf896aa0>, <__main__.Venta object at 0x7f0caf894eb0>, <__main__.Venta object at 0x7f0caf897d90>, <__main__.Venta object at 0x7f0caf894520>, <__main__.Venta object at 0x7f0caf896500>, <__main__.Venta object at 0x7f0caf896680>, <__main__.Venta object at 0x7f0caf8945e0>, <__main__.Venta object at 0x7f0caf894670>, <__main__.Venta object at 0x7f0caf8963e0>, <__main__.Venta object at 0x7f0caf897550>, <__main__.Venta object at 0x7f0caf896590>, <__main__.Venta object at 0x7f0caf897c40>, <__main__.Venta object at 0x7f0caf897d60>, <__main__.Venta object at 0x7f0caf896cb0>, <__main__.Venta object at 0x7f0caf894c10>, <__main__.Venta object at 0x7f0caf894220>, <__main__.Venta object at 0x7f0caf8967a0>, <__main__.Venta object at 0x7f0caf8976d0>, <__main__.Venta object at 0x7f0caf895cc0>, <__main__.Venta object at 0x7f0caf896c50>, <__main__.Venta object at 0x7f0c7a7acca0>, <__main__.Venta object at 0x7f0c7a7ac340>, <__main__.Venta object at 0x7f0c7a7acbb0>, <__main__.Venta object at 0x7f0c7a7af100>, <__main__.Venta object at 0x7f0c7a7ada80>, <__main__.Venta object at 0x7f0c7a7acee0>, <__main__.Venta object at 0x7f0c7a7aceb0>]
print(dir(ventas[0]))
['Fecha', 'ID_Cliente', 'ID_Empleado', 'ID_Venta', '__abstract__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__mapper__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_sa_class_manager', '_sa_instance_state', '_sa_registry', 'cliente', 'empleado', 'metadata', 'registry']
ventas[0].empleado.Nombre
'Carlos'
for venta in ventas:
print(f"Venta ID: {venta.ID_Venta}, Fecha: {venta.Fecha}")
# Accediendo a los atributos del objeto relacionado Empleado
print(f"Empleado: {venta.empleado.Nombre} {venta.empleado.Apellido}, Cargo: {venta.empleado.Cargo}")
# Accediendo a los atributos del objeto relacionado Cliente
print(f"Cliente: {venta.cliente.Nombre} {venta.cliente.Apellido}, Email: {venta.cliente.Email}")
print("-----")
Venta ID: 1, Fecha: 2023-09-01
Empleado: Carlos Rodríguez, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 2, Fecha: 2023-09-02
Empleado: Carlos Rodríguez, Cargo: Vendedor
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 3, Fecha: 2023-09-03
Empleado: Pedro González, Cargo: Cajero
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 4, Fecha: 2023-09-04
Empleado: Carlos Rodríguez, Cargo: Vendedor
Cliente: Sofía Rodríguez, Email: sofia.rodriguez@email.com
-----
Venta ID: 5, Fecha: 2023-09-05
Empleado: Fernando García, Cargo: Almacenero
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 6, Fecha: 2023-09-06
Empleado: Carmen Pérez, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 7, Fecha: 2023-09-07
Empleado: Antonio Sánchez, Cargo: Cajero
Cliente: David Fernández, Email: david.fernandez@email.com
-----
Venta ID: 8, Fecha: 2023-09-08
Empleado: Miguel Gómez, Cargo: Vendedor
Cliente: Laura Ruiz, Email: laura.ruiz@email.com
-----
Venta ID: 9, Fecha: 2023-09-09
Empleado: Rosa Ruiz, Cargo: Almacenero
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 10, Fecha: 2023-09-10
Empleado: Francisco Hernández, Cargo: Vendedor
Cliente: Elena Morales, Email: elena.morales@email.com
-----
Venta ID: 11, Fecha: 2023-09-11
Empleado: Carlos Rodríguez, Cargo: Vendedor
Cliente: Javier Ortega, Email: javier.ortega@email.com
-----
Venta ID: 12, Fecha: 2023-09-12
Empleado: Sergio Díaz, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 13, Fecha: 2023-09-13
Empleado: Carlos Rodríguez, Cargo: Vendedor
Cliente: Pablo Romero, Email: pablo.romero@email.com
-----
Venta ID: 14, Fecha: 2023-09-14
Empleado: Alejandro Moreno, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 15, Fecha: 2023-09-15
Empleado: Esther Muñoz, Cargo: Cajero
Cliente: José Torres, Email: jose.torres@email.com
-----
Venta ID: 16, Fecha: 2023-09-16
Empleado: Pedro González, Cargo: Cajero
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 17, Fecha: 2023-09-17
Empleado: Pilar Alonso, Cargo: Almacenero
Cliente: Jorge Vázquez, Email: jorge.vazquez@email.com
-----
Venta ID: 18, Fecha: 2023-09-18
Empleado: Andrés Gutiérrez, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 19, Fecha: 2023-09-19
Empleado: Pedro González, Cargo: Cajero
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 20, Fecha: 2023-09-20
Empleado: Javier Domínguez, Cargo: Vendedor
Cliente: Cristina Guerrero, Email: cristina.guerrero@email.com
-----
Venta ID: 21, Fecha: 2023-09-21
Empleado: María López, Cargo: Gerente
Cliente: Rubén Molina, Email: ruben.molina@email.com
-----
Venta ID: 22, Fecha: 2023-09-22
Empleado: Rafael Ramos, Cargo: Vendedor
Cliente: Juan Pérez, Email: juan.perez@email.com
-----
Venta ID: 23, Fecha: 2023-09-23
Empleado: Lorena Blanco, Cargo: Cajero
Cliente: Álvaro Marín, Email: alvaro.marin@email.com
-----
Venta ID: 24, Fecha: 2023-09-24
Empleado: Enrique Medina, Cargo: Vendedor
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 25, Fecha: 2023-09-25
Empleado: Sonia Castro, Cargo: Almacenero
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 26, Fecha: 2023-09-26
Empleado: Víctor Ortega, Cargo: Vendedor
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 27, Fecha: 2023-09-27
Empleado: Laura Cano, Cargo: Cajero
Cliente: Mario Domínguez, Email: mario.dominguez@email.com
-----
Venta ID: 28, Fecha: 2023-09-28
Empleado: Pedro González, Cargo: Cajero
Cliente: Silvia Reyes, Email: silvia.reyes@email.com
-----
Venta ID: 29, Fecha: 2023-09-29
Empleado: Lucía Martínez, Cargo: Vendedor
Cliente: Ana García, Email: ana.garcia@email.com
-----
Venta ID: 30, Fecha: 2023-09-30
Empleado: Pedro González, Cargo: Cajero
Cliente: Natalia Cabrera, Email: natalia.cabrera@email.com
-----
#Ojo, tenemos que cerrar la conexión
session.close()
# Hagamos un filtro en una query para traer una información específica.
id_empleado = 1
ventas_empleado = session.query(Venta).filter(Venta.ID_Empleado == id_empleado).all()
for venta in ventas_empleado:
print(f"Venta ID: {venta.ID_Venta}, Fecha: {venta.Fecha}, ID_Cliente: {venta.ID_Cliente}")
Venta ID: 1, Fecha: 2023-09-01, ID_Cliente: 1
Venta ID: 2, Fecha: 2023-09-02, ID_Cliente: 2
Venta ID: 4, Fecha: 2023-09-04, ID_Cliente: 4
Venta ID: 11, Fecha: 2023-09-11, ID_Cliente: 11
Venta ID: 13, Fecha: 2023-09-13, ID_Cliente: 13
nombre_empleado = "Pedro"
apellido_empleado = "González"
ventas_empleado = session.query(Venta)\
.join(Empleado, Venta.ID_Empleado == Empleado.ID_Empleado)\
.filter(Empleado.Nombre == nombre_empleado, Empleado.Apellido == apellido_empleado)\
.all()
for venta in ventas_empleado:
print(f"Venta ID: {venta.ID_Venta}, Fecha: {venta.Fecha}, ID_Cliente: {venta.ID_Cliente}")
Venta ID: 3, Fecha: 2023-09-03, ID_Cliente: 2
Venta ID: 16, Fecha: 2023-09-16, ID_Cliente: 1
Venta ID: 19, Fecha: 2023-09-19, ID_Cliente: 1
Venta ID: 28, Fecha: 2023-09-28, ID_Cliente: 28
Venta ID: 30, Fecha: 2023-09-30, ID_Cliente: 30
ACTIVIDAD#
Indagar sobre otros métodos además del .all() para realizar consultas con los ORM´s