SQLAlchemy ORM - SQL testuale

In precedenza, l'SQL testuale che utilizza la funzione text () è stato spiegato dal punto di vista del linguaggio di espressione principale di SQLAlchemy. Ora ne discuteremo dal punto di vista ORM.

Le stringhe letterali possono essere utilizzate in modo flessibile con l'oggetto Query specificando il loro utilizzo con il costrutto text (). La maggior parte dei metodi applicabili lo accetta. Ad esempio, filter () e order_by ().

Nell'esempio fornito di seguito, il metodo filter () traduce la stringa "id <3" in WHERE id <3

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

L'espressione SQL non elaborata generata mostra la conversione del filtro nella clausola WHERE con il codice illustrato di seguito -

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

Dai nostri dati di esempio nella tabella Clienti, verranno selezionate due righe e la colonna del nome verrà stampata come segue:

Ravi Kumar
Komal Pande

Per specificare i parametri di associazione con SQL basato su stringa, utilizzare i due punti e per specificare i valori, utilizzare il metodo params ().

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

L'SQL effettivo visualizzato sulla console Python sarà il seguente:

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

Per usare un'istruzione interamente basata su stringhe, un costrutto text () che rappresenta un'istruzione completa può essere passato a from_statement ().

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

Il risultato del codice precedente sarà un'istruzione SELECT di base come indicato di seguito:

SELECT * FROM customers

Ovviamente verranno selezionati tutti i record nella tabella dei clienti.

Il costrutto text () ci consente di collegare il suo SQL testuale alle espressioni di colonna Core o ORM mappate in modo posizionale. Possiamo ottenere ciò passando le espressioni di colonna come argomenti posizionali al metodo 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()

Le colonne id e nome di tutte le righe verranno selezionate anche se il motore SQLite esegue la seguente espressione generata dal codice sopra mostra tutte le colonne nel metodo text () -

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