SQLAlchemy ORM - tekstowy SQL

Wcześniej tekstowy SQL korzystający z funkcji text () został wyjaśniony z perspektywy podstawowego języka wyrażeń SQLAlchemy. Teraz omówimy to z punktu widzenia ORM.

Ciągów literałów można elastycznie używać z obiektem Query, określając ich użycie za pomocą konstrukcji text (). Większość odpowiednich metod to akceptuje. Na przykład filter () i order_by ().

W poniższym przykładzie metoda filter () tłumaczy ciąg „id <3” na WHERE id <3

from sqlalchemy import text
for cust in session.query(Customers).filter(text("id<3")):
   print(cust.name)

Wygenerowane surowe wyrażenie SQL pokazuje konwersję filtru do klauzuli WHERE z kodem przedstawionym poniżej -

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

Z naszych przykładowych danych w tabeli Klienci zostaną wybrane dwa wiersze, a kolumna z nazwą zostanie wydrukowana w następujący sposób -

Ravi Kumar
Komal Pande

Aby określić parametry wiązania za pomocą łańcuchowego kodu SQL, użyj dwukropka, a aby określić wartości, użyj metody params ().

cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()

Efektywny SQL wyświetlany na konsoli Pythona będzie taki, jak podano poniżej -

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 = ?

Aby użyć instrukcji całkowicie opartej na ciągach znaków, konstrukcję text () reprezentującą kompletną instrukcję można przekazać do funkcji from_statement ().

session.query(Customers).from_statement(text("SELECT * FROM customers")).all()

Wynikiem powyższego kodu będzie podstawowa instrukcja SELECT, jak podano poniżej -

SELECT * FROM customers

Oczywiście zostaną wybrane wszystkie rekordy w tabeli klientów.

Konstrukcja text () umożliwia pozycjonowanie jego tekstowego SQL z wyrażeniami kolumnowymi Core lub odwzorowanymi na ORM. Możemy to osiągnąć, przekazując wyrażenia kolumnowe jako argumenty pozycyjne do metody 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()

Kolumny id i name we wszystkich wierszach zostaną zaznaczone, mimo że silnik SQLite wykona następujące wyrażenie wygenerowane przez powyższy kod pokazuje wszystkie kolumny w metodzie text () -

SELECT name, id, name, address, email FROM customers