SQLAlchemy ORM - Đang tải háo hức

Tải hào hứng làm giảm số lượng truy vấn. SQLAlchemy cung cấp các hàm tải mong muốn được gọi thông qua các tùy chọn truy vấn đưa ra các hướng dẫn bổ sung cho Truy vấn. Các tùy chọn này xác định cách tải các thuộc tính khác nhau thông qua phương thức Query.options ().

Tải truy vấn con

Chúng tôi muốn rằng các hóa đơn của Khách hàng phải được tải nhanh chóng. Tùy chọn orm.subqueryload () đưa ra câu lệnh SELECT thứ hai tải đầy đủ các tập hợp được liên kết với kết quả vừa tải. Tên “truy vấn con” khiến câu lệnh SELECT được xây dựng trực tiếp thông qua Truy vấn được sử dụng lại và nhúng dưới dạng truy vấn con vào một SELECT đối với bảng liên quan.

from sqlalchemy.orm import subqueryload
c1 = session.query(Customer).options(subqueryload(Customer.invoices)).filter_by(name = 'Govind Pant').one()

Điều này dẫn đến hai biểu thức SQL sau:

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email
FROM customers
WHERE customers.name = ?
('Govind Pant',)

SELECT invoices.id 
AS invoices_id, invoices.custid 
AS invoices_custid, invoices.invno 
AS invoices_invno, invoices.amount 
AS invoices_amount, anon_1.customers_id 
AS anon_1_customers_id
FROM (
   SELECT customers.id 
   AS customers_id
   FROM customers
   WHERE customers.name = ?) 
   
AS anon_1 
JOIN invoices 
ON anon_1.customers_id = invoices.custid 
ORDER BY anon_1.customers_id, invoices.id 2018-06-25 18:24:47,479 
INFO sqlalchemy.engine.base.Engine ('Govind Pant',)

Để truy cập dữ liệu từ hai bảng, chúng ta có thể sử dụng chương trình dưới đây:

print (c1.name, c1.address, c1.email)

for x in c1.invoices:
   print ("Invoice no : {}, Amount : {}".format(x.invno, x.amount))

Kết quả của chương trình trên như sau:

Govind Pant Gulmandi Aurangabad [email protected]
Invoice no : 3, Amount : 10000
Invoice no : 4, Amount : 5000

Tải tham gia

Hàm còn lại được gọi là orm.joinedload (). Điều này tạo ra một THAM GIA NGOÀI TRÁI. Đối tượng khách hàng tiềm năng cũng như đối tượng hoặc bộ sưu tập có liên quan được tải trong một bước.

from sqlalchemy.orm import joinedload
c1 = session.query(Customer).options(joinedload(Customer.invoices)).filter_by(name='Govind Pant').one()

Điều này phát ra biểu thức sau cho kết quả tương tự như trên:

SELECT customers.id 
AS customers_id, customers.name 
AS customers_name, customers.address 
AS customers_address, customers.email 
AS customers_email, invoices_1.id 
AS invoices_1_id, invoices_1.custid 
AS invoices_1_custid, invoices_1.invno 
AS invoices_1_invno, invoices_1.amount 
AS invoices_1_amount

FROM customers 
LEFT OUTER JOIN invoices 
AS invoices_1 
ON customers.id = invoices_1.custid

WHERE customers.name = ? ORDER BY invoices_1.id
('Govind Pant',)

OUTER JOIN dẫn đến hai hàng, nhưng nó cung cấp lại một trường hợp của Khách hàng. Điều này là do Truy vấn áp dụng chiến lược "duy nhất", dựa trên nhận dạng đối tượng, cho các thực thể được trả về. Tải mong muốn đã tham gia có thể được áp dụng mà không ảnh hưởng đến kết quả truy vấn.

Subqueryload () thích hợp hơn để tải các tập hợp liên quan trong khi joinload () phù hợp hơn với mối quan hệ nhiều-một.