Trabajar con objetos relacionados

En este capítulo, nos centraremos en los objetos relacionados en SQLAlchemy ORM.

Ahora, cuando creamos un objeto Cliente, aparecerá una colección de facturas en blanco en forma de Lista de Python.

c1 = Customer(name = "Gopal Krishna", address = "Bank Street Hydarebad", email = "[email protected]")

El atributo de facturas de c1.invoices será una lista vacía. Podemos asignar elementos en la lista como:

c1.invoices = [Invoice(invno = 10, amount = 15000), Invoice(invno = 14, amount = 3850)]

Enviemos este objeto a la base de datos usando el objeto Session de la siguiente manera:

from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind = engine)
session = Session()
session.add(c1)
session.commit()

Esto generará automáticamente consultas INSERT para clientes y tablas de facturas -

INSERT INTO customers (name, address, email) VALUES (?, ?, ?) 
('Gopal Krishna', 'Bank Street Hydarebad', '[email protected]')
INSERT INTO invoices (custid, invno, amount) VALUES (?, ?, ?)
(2, 10, 15000)
INSERT INTO invoices (custid, invno, amount) VALUES (?, ?, ?)
(2, 14, 3850)

Veamos ahora el contenido de la tabla de clientes y la tabla de facturas en la vista de tabla de SQLiteStudio -

Puede construir un objeto Cliente proporcionando un atributo mapeado de facturas en el propio constructor utilizando el siguiente comando:

c2 = [
   Customer(
      name = "Govind Pant", 
      address = "Gulmandi Aurangabad",
      email = "[email protected]",
      invoices = [Invoice(invno = 3, amount = 10000), 
      Invoice(invno = 4, amount = 5000)]
   )
]

O una lista de objetos que se agregarán usando la función add_all () del objeto de sesión como se muestra a continuación:

rows = [
   Customer(
      name = "Govind Kala", 
      address = "Gulmandi Aurangabad", 
      email = "[email protected]", 
      invoices = [Invoice(invno = 7, amount = 12000), Invoice(invno = 8, amount = 18500)]),

   Customer(
      name = "Abdul Rahman", 
      address = "Rohtak", 
      email = "[email protected]",
      invoices = [Invoice(invno = 9, amount = 15000), 
      Invoice(invno = 11, amount = 6000)
   ])
]

session.add_all(rows)
session.commit()