SQLAlchemy ORM-빠른 로딩

빠른로드는 쿼리 수를 줄입니다. SQLAlchemy는 쿼리에 추가 지침을 제공하는 쿼리 옵션을 통해 호출되는 즉시로드 기능을 제공합니다. 이러한 옵션은 Query.options () 메서드를 통해 다양한 속성을로드하는 방법을 결정합니다.

하위 쿼리로드

Customer.invoices가 열심히로드되기를 바랍니다. orm.subqueryload () 옵션은 방금로드 된 결과와 관련된 컬렉션을 완전히로드하는 두 번째 SELECT 문을 제공합니다. "subquery"라는 이름을 사용하면 쿼리를 통해 직접 SELECT 문이 생성되고 관련 테이블에 대한 SELECT에 하위 쿼리로 재사용되고 포함됩니다.

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

결과적으로 다음 두 SQL 표현식이 생성됩니다.

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

두 테이블의 데이터에 액세스하려면 아래 프로그램을 사용할 수 있습니다.

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

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

위 프로그램의 출력은 다음과 같습니다.

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

결합 된 부하

다른 함수는 orm.joinedload ()입니다. 이것은 LEFT OUTER JOIN을 방출합니다. 리드 개체와 관련 개체 또는 컬렉션이 한 단계로로드됩니다.

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

이것은 위와 동일한 출력을 제공하는 다음 표현식을 방출합니다.

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은 두 개의 행을 생성했지만 Customer 인스턴스 하나를 반환합니다. 쿼리는 개체 ID를 기반으로 "고유 한"전략을 반환 된 엔터티에 적용하기 때문입니다. 조인 된 즉시로드는 쿼리 결과에 영향을주지 않고 적용 할 수 있습니다.

subqueryload ()는 관련 컬렉션을로드하는 데 더 적합하고 joinload ()는 다 대일 관계에 더 적합합니다.