¿Cómo se ejecuta SQL sin procesar en SQLAlchemy?
Tengo una aplicación web de Python que se ejecuta en un matraz e interfaces con la base de datos a través de SQLAlchemy.
Necesito una forma de ejecutar el SQL sin formato. La consulta involucra múltiples combinaciones de tablas junto con vistas en línea.
He intentado:
connection = db.session.connection()
connection.execute( <sql here> )
Pero sigo recibiendo errores de puerta de enlace.
python
sql
sqlalchemy
flask
flask-sqlalchemy
starwing123
fuente
fuente
namedtuple
ydict
directamente: initd.org/psycopg/docs/extras.html .Respuestas:
Has probado:
o:
fuente
BEGIN
yCOMMIT
usted mismo.db.engine.execute(text("<sql here>")).execution_options(autocommit=True))
ejecuta y lo compromete también.Los objetos de sesión de SQL Alchemy tienen su propio
execute
método:Todas las consultas de su aplicación deben pasar por un objeto de sesión, ya sean SQL sin formato o no. Esto asegura que las consultas sean gestionadas adecuadamente por una transacción , lo que permite que múltiples consultas en la misma solicitud se confirmen o reviertan como una sola unidad. Salir de la transacción utilizando el motor o la conexión lo pone en un riesgo mucho mayor de errores sutiles, posiblemente difíciles de detectar, que pueden dejarlo con datos corruptos. Cada solicitud debe asociarse con una sola transacción, y el uso
db.session
garantizará que este sea el caso de su aplicación.También tenga en cuenta que
execute
está diseñado para consultas parametrizadas . Use parámetros, como:val
en el ejemplo, para cualquier entrada a la consulta para protegerse de los ataques de inyección SQL. Puede proporcionar el valor de estos parámetros pasando undict
segundo argumento, donde cada clave es el nombre del parámetro tal como aparece en la consulta. La sintaxis exacta del parámetro en sí puede ser diferente según su base de datos, pero todas las principales bases de datos relacionales los admiten de alguna forma.Asumiendo que es una
SELECT
consulta, esto devolverá un iterable deRowProxy
objetos.Puede acceder a columnas individuales con una variedad de técnicas:
Personalmente, prefiero convertir los resultados en
namedtuple
s:Si no está usando la extensión Flask-SQLAlchemy, aún puede usar fácilmente una sesión:
fuente
docs: Tutorial del lenguaje de expresiones SQL - Usar texto
ejemplo:
fuente
==
?=
normalmente está reservado para asignar un valor; mientras que==
está reservado para comparar valoresPuede obtener los resultados de las consultas SELECT SQL utilizando
from_statement()
ytext()
como se muestra aquí . No tienes que lidiar con las tuplas de esta manera. Como ejemplo para una clase queUser
tiene el nombre de la tablausers
que puede probar,fuente
ejecuta el
<sql here>
pero no lo confirma a menos que esté enautocommit
modo. Por lo tanto, las inserciones y actualizaciones no se reflejarían en la base de datos.Para comprometerse después de los cambios, haga
fuente
Primero, asigne su módulo (si su módulo / aplicación es manage.py en la carpeta principal y usted está en un sistema operativo UNIX), ejecute:
Ejecutar frasco shell
Importar lo que necesitamos ::
Ejecute su consulta:
Esto utiliza la conexión de base de datos actual que tiene la aplicación.
fuente
¿Has intentado usar
connection.execute(text( <sql here> ), <bind params here> )
y vincular parámetros como se describe en los documentos ? Esto puede ayudar a resolver muchos problemas de formato y rendimiento de parámetros. Tal vez el error de puerta de enlace es un tiempo de espera? Los parámetros de enlace tienden a hacer que las consultas complejas se ejecuten sustancialmente más rápido.fuente
connection.execute(text(<sql here>), <bind params> )
.bind params
NO debería estar adentrotext()
. alimentación en los parámetros de enlace al método execute ()Si se quiere evitar tuplas, otra forma es llamando a los
first
,one
oall
métodos:fuente