Об'єкти сеансу алхімії SQL мають власний execute
метод:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Усі ваші запити додатків повинні проходити через об'єкт сеансу, незалежно від того, чи є вони необробленими SQL чи ні. Це забезпечує правильне керування запитами трансакцією , яка дозволяє виконувати чи запити декількох запитів в одному запиті як один блок. Якщо виходити за межі транзакції за допомогою двигуна або підключення, ви піддаєте набагато більший ризик виникнення тонких, можливо важких для виявлення помилок, які можуть залишити вас зіпсованими даними. Кожен запит повинен бути пов’язаний лише з однією транзакцією, і використання db.session
цього гарантує, що це стосується вашої заявки.
Також врахуйте, що execute
розроблено для параметризованих запитів . Використовуйте параметри, як :val
у прикладі, для будь-яких входів у запит, щоб захистити себе від атак на ін'єкцію SQL. Ви можете надати значення для цих параметрів, передавши a dict
як другий аргумент, де кожен ключ - це ім'я параметра, як воно відображається в запиті. Точний синтаксис самого параметра може бути різним залежно від вашої бази даних, але всі основні реляційні бази даних підтримують їх у певній формі.
Якщо припустити , що це 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})