Los objetos de sesión de SQL Alchemy tienen su propio execute
método:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
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 un dict
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 de RowProxy
objetos.
Puede acceder a columnas individuales con una variedad de técnicas:
for r in result:
print(r[0]) # Access by positional index
print(r['my_column']) # Access by column name as a string
r_dict = dict(r.items()) # convert to dict keyed by column names
Personalmente, prefiero convertir los resultados en namedtuple
s:
from collections import namedtuple
Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
print(r.my_column)
print(r)
Si no está usando la extensión Flask-SQLAlchemy, aún puede usar fácilmente una sesión:
import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session
engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))
s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})