Объекты сеанса SQL Alchemy имеют свой собственный execute
метод:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Все запросы вашего приложения должны проходить через объект сеанса, независимо от того, являются ли они необработанным SQL или нет. Это обеспечивает правильное управление запросами с помощью транзакции , что позволяет фиксировать или откатывать несколько запросов в одном запросе как один блок. Выход за пределы транзакции с использованием механизма или соединения подвергает вас гораздо большему риску скрытых, возможно трудных для обнаружения ошибок, которые могут оставить вас с поврежденными данными. Каждый запрос должен быть связан только с одной транзакцией, и использование db.session
гарантирует, что это относится к вашему приложению.
Также обратите внимание, что execute
он предназначен для параметризованных запросов . Используйте параметры, как :val
в примере, для любых входных данных запроса, чтобы защитить себя от атак SQL-инъекций. Вы можете предоставить значение для этих параметров, передав в dict
качестве второго аргумента a , где каждый ключ - это имя параметра в том виде, в каком оно появляется в запросе. Точный синтаксис самого параметра может отличаться в зависимости от вашей базы данных, но все основные реляционные базы данных поддерживают их в той или иной форме.
Если предположить , что это SELECT
запрос, это вернет итератор из RowProxy
объектов.
Вы можете получить доступ к отдельным столбцам различными способами:
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
Лично я предпочитаю конвертировать результаты в 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)
Если вы не используете расширение Flask-SQLAlchemy, вы все равно можете легко использовать сеанс:
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})