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