Работа со связанными объектами

В этой главе мы сосредоточимся на связанных объектах в SQLAlchemy ORM.

Теперь, когда мы создаем объект Customer, будет представлена ​​пустая коллекция счетов в виде списка Python.

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

Атрибут invoices c1.invoices будет пустым списком. Мы можем назначить элементы в списке как -

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

Давайте зафиксируем этот объект в базе данных, используя объект Session следующим образом:

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

Это автоматически создаст запросы INSERT для таблиц клиентов и счетов-фактур -

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)

Давайте теперь посмотрим на содержимое таблицы клиентов и таблицы счетов-фактур в табличном представлении SQLiteStudio -

Вы можете создать объект Customer, предоставив сопоставленный атрибут счетов-фактур в самом конструкторе, используя следующую команду:

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

Или список объектов, которые нужно добавить с помощью функции add_all () объекта сеанса, как показано ниже -

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()