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