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.