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.