SQLAlchemy ORM - SQL textual
Anteriormente, SQL textual que usa la función text () se ha explicado desde la perspectiva del lenguaje de expresión central de SQLAlchemy. Ahora lo discutiremos desde el punto de vista ORM.
Las cadenas literales se pueden usar de manera flexible con el objeto Query especificando su uso con la construcción text (). La mayoría de los métodos aplicables lo aceptan. Por ejemplo, filter () y order_by ().
En el ejemplo que se muestra a continuación, el método filter () traduce la cadena "id <3" a WHERE id <3
from sqlalchemy import text
for cust in session.query(Customers).filter(text("id<3")):
print(cust.name)
La expresión SQL sin procesar generada muestra la conversión del filtro a la cláusula WHERE con el código que se ilustra a continuación:
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 nuestros datos de muestra en la tabla Clientes, se seleccionarán dos filas y la columna de nombre se imprimirá de la siguiente manera:
Ravi Kumar
Komal Pande
Para especificar parámetros de vinculación con SQL basado en cadenas, utilice dos puntos y, para especificar los valores, utilice el método params ().
cust = session.query(Customers).filter(text("id = :value")).params(value = 1).one()
El SQL efectivo que se muestra en la consola de Python será el siguiente:
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 una declaración completamente basada en cadenas, una construcción text () que representa una declaración completa se puede pasar a from_statement ().
session.query(Customers).from_statement(text("SELECT * FROM customers")).all()
El resultado del código anterior será una instrucción SELECT básica como se indica a continuación:
SELECT * FROM customers
Obviamente, se seleccionarán todos los registros de la tabla de clientes.
La construcción text () nos permite vincular su SQL textual a expresiones de columna mapeadas en Core o ORM posicionalmente. Podemos lograr esto pasando expresiones de columna como argumentos posicionales al 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()
Las columnas de identificación y nombre de todas las filas se seleccionarán aunque el motor SQLite ejecute la siguiente expresión generada por el código anterior que muestra todas las columnas en el método text ():
SELECT name, id, name, address, email FROM customers