SQLAlchemy ORM - SQL textual

Anteriormente, o SQL textual usando a função text () foi explicado da perspectiva da linguagem de expressão central de SQLAlchemy. Agora vamos discutir isso do ponto de vista ORM.

Strings literais podem ser usados ​​de forma flexível com o objeto Query, especificando seu uso com a construção text (). A maioria dos métodos aplicáveis ​​o aceita. Por exemplo, filter () e order_by ().

No exemplo abaixo, o método filter () traduz a string “id <3” para WHERE id <3

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

A expressão SQL bruta gerada mostra a conversão do filtro para a cláusula WHERE com o código ilustrado abaixo -

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

De nossos dados de amostra na tabela Clientes, duas linhas serão selecionadas e a coluna de nome será impressa da seguinte forma -

Ravi Kumar
Komal Pande

Para especificar parâmetros de vinculação com SQL baseado em string, use dois-pontos e, para especificar os valores, use o método params ().

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

O SQL efetivo exibido no console Python será conforme fornecido abaixo -

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

Para usar uma declaração inteiramente baseada em string, uma construção text () representando uma declaração completa pode ser passada para from_statement ().

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

O resultado do código acima será uma instrução SELECT básica conforme fornecido abaixo -

SELECT * FROM customers

Obviamente, todos os registros da tabela de clientes serão selecionados.

A construção text () nos permite vincular posicionalmente seu SQL textual a expressões de coluna mapeadas por ORM ou Core. Podemos conseguir isso passando expressões de coluna como argumentos posicionais para o método 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()

As colunas id e name de todas as linhas serão selecionadas mesmo que o motor SQLite execute a seguinte expressão gerada pelo código acima mostra todas as colunas no método text () -

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