SQLAlchemy ORM-텍스트 SQL
앞서 text () 함수를 사용한 텍스트 SQL은 SQLAlchemy의 핵심 표현 언어 관점에서 설명했습니다. 이제 우리는 ORM 관점에서 논의 할 것입니다.
리터럴 문자열은 text () 구문과 함께 사용을 지정하여 Query 객체와 함께 유연하게 사용할 수 있습니다. 대부분의 적용 가능한 방법은 그것을 받아들입니다. 예를 들어, filter () 및 order_by ().
아래 주어진 예에서 filter () 메서드는 문자열 "id <3"을 WHERE id <3으로 변환합니다.
from sqlalchemy import text
for cust in session.query(Customers).filter(text("id<3")):
print(cust.name)
생성 된 원시 SQL 표현식은 아래에 설명 된 코드로 필터를 WHERE 절로 변환 한 것을 보여줍니다.
SELECT customers.id
AS customers_id, customers.name
AS customers_name, customers.address
AS customers_address, customers.email
AS customers_email
FROM customers
WHERE id<3
Customers 테이블의 샘플 데이터에서 두 행이 선택되고 이름 열이 다음과 같이 인쇄됩니다.
Ravi Kumar
Komal Pande
문자열 기반 SQL로 바인드 매개 변수를 지정하려면 콜론을 사용하고 값을 지정하려면 params () 메소드를 사용하십시오.
cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()
Python 콘솔에 표시되는 효과적인 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 id = ?
완전한 문자열 기반 명령문을 사용하려면 완전한 명령문을 나타내는 text () 구조를 from_statement ()에 전달할 수 있습니다.
session.query(Customers).from_statement(text("SELECT * FROM customers")).all()
위 코드의 결과는 아래와 같이 기본 SELECT 문이됩니다.
SELECT * FROM customers
분명히 고객 테이블의 모든 레코드가 선택됩니다.
text () 구조를 사용하면 텍스트 SQL을 Core 또는 ORM 매핑 된 열 표현식에 위치 적으로 연결할 수 있습니다. 열 표현식을 위치 인수로 TextClause.columns () 메서드에 전달하여이를 달성 할 수 있습니다.
stmt = text("SELECT name, id, name, address, email FROM customers")
stmt = stmt.columns(Customers.id, Customers.name)
session.query(Customers.id, Customers.name).from_statement(stmt).all()
SQLite 엔진이 위의 코드에서 생성 된 다음 표현식을 실행하더라도 모든 행의 ID 및 이름 열은 text () 메서드의 모든 열을 보여줍니다.
SELECT name, id, name, address, email FROM customers