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 ()는 다 대일 관계에 더 적합합니다.