SQLAlchemy ORM - Hevesli Yükleme

Yoğun yük, sorgu sayısını azaltır. SQLAlchemy, Sorguya ek talimatlar veren sorgu seçenekleri aracılığıyla başlatılan istekli yükleme işlevleri sunar. Bu seçenekler, Query.options () yöntemi aracılığıyla çeşitli özniteliklerin nasıl yükleneceğini belirler.

Alt Sorgu Yükü

Müşteri faturalarının hevesle yüklenmesini istiyoruz. Orm.subqueryload () seçeneği, yeni yüklenen sonuçlarla ilişkili koleksiyonları tam olarak yükleyen ikinci bir SELECT deyimi verir. "Alt sorgu" adı, SELECT ifadesinin doğrudan Sorgu aracılığıyla yeniden yapılandırılmasına ve ilgili tabloya karşı bir SELECT'e bir alt sorgu olarak gömülmesine neden olur.

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

Bu, aşağıdaki iki SQL ifadesine neden olur -

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',)

Verilere iki tablodan erişmek için aşağıdaki programı kullanabiliriz -

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

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

Yukarıdaki programın çıktısı aşağıdaki gibidir -

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

Birleştirilmiş Yük

Diğer işleve orm.joinedload () adı verilir. Bu, LEFT OUTER JOIN yayar. Müşteri adayı nesnenin yanı sıra ilgili nesne veya koleksiyon tek adımda yüklenir.

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

Bu, yukarıdaki ile aynı çıktıyı veren aşağıdaki ifadeyi yayar -

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 iki satırla sonuçlandı, ancak Müşterinin bir örneğini geri veriyor. Bunun nedeni, Sorgunun, döndürülen varlıklara nesne kimliğine dayalı bir "benzersizleştirme" stratejisi uygulamasıdır. Birleştirilmiş istekli yükleme, sorgu sonuçlarını etkilemeden uygulanabilir.

Subqueryload (), ilgili koleksiyonları yüklemek için daha uygunken, joinload () çoka bir ilişki için daha uygundur.