SQLAlchemy Core: uso de SQL textual
SQLAlchemy le permite usar cadenas, para aquellos casos en los que el SQL ya se conoce y no hay una gran necesidad de que la declaración admita características dinámicas. La construcción text () se usa para componer una declaración textual que se pasa a la base de datos casi sin cambios.
Construye un nuevo TextClause, que representa una cadena SQL textual directamente como se muestra en el siguiente código:
from sqlalchemy import text
t = text("SELECT * FROM students")
result = connection.execute(t)
Las ventajas text() proporciona sobre una cadena simple son:
- soporte neutral de backend para parámetros de enlace
- opciones de ejecución por sentencia
- comportamiento de escritura de la columna de resultado
La función text () requiere parámetros enlazados en el formato de dos puntos con nombre. Son consistentes independientemente del backend de la base de datos. Para enviar valores para los parámetros, los pasamos al método execute () como argumentos adicionales.
El siguiente ejemplo usa parámetros enlazados en SQL textual:
from sqlalchemy.sql import text
s = text("select students.name, students.lastname from students where students.name between :x and :y")
conn.execute(s, x = 'A', y = 'L').fetchall()
La función text () construye una expresión SQL de la siguiente manera:
select students.name, students.lastname from students where students.name between ? and ?
Los valores de x = 'A' e y = 'L' se pasan como parámetros. El resultado es una lista de filas con nombres entre 'A' y 'L' -
[('Komal', 'Bhandari'), ('Abdul', 'Sattar')]
La construcción text () admite valores enlazados preestablecidos mediante el método TextClause.bindparams (). Los parámetros también se pueden escribir explícitamente de la siguiente manera:
stmt = text("SELECT * FROM students WHERE students.name BETWEEN :x AND :y")
stmt = stmt.bindparams(
bindparam("x", type_= String),
bindparam("y", type_= String)
)
result = conn.execute(stmt, {"x": "A", "y": "L"})
The text() function also be produces fragments of SQL within a select() object that
accepts text() objects as an arguments. The “geometry” of the statement is provided by
select() construct , and the textual content by text() construct. We can build a statement
without the need to refer to any pre-established Table metadata.
from sqlalchemy.sql import select
s = select([text("students.name, students.lastname from students")]).where(text("students.name between :x and :y"))
conn.execute(s, x = 'A', y = 'L').fetchall()
También puedes usar and_() función para combinar múltiples condiciones en la cláusula WHERE creada con la ayuda de la función text ().
from sqlalchemy import and_
from sqlalchemy.sql import select
s = select([text("* from students")]) \
.where(
and_(
text("students.name between :x and :y"),
text("students.id>2")
)
)
conn.execute(s, x = 'A', y = 'L').fetchall()
El código anterior obtiene filas con nombres entre "A" y "L" con id mayor que 2. La salida del código se da a continuación:
[(3, 'Komal', 'Bhandari'), (4, 'Abdul', 'Sattar')]