Obiekty sesji Alchemia SQL mają własną execute
metodę:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Wszystkie zapytania aplikacji powinny przechodzić przez obiekt sesji, bez względu na to, czy jest to surowy SQL, czy nie. Zapewnia to prawidłowe zarządzanie zapytaniami przez transakcję , co pozwala na zatwierdzenie lub wycofanie wielu zapytań w tym samym żądaniu jako pojedynczej jednostki. Wyjście poza transakcję za pomocą silnika lub połączenia naraża Cię na znacznie większe ryzyko subtelnych, być może trudnych do wykrycia błędów, które mogą spowodować uszkodzenie danych. Każde żądanie powinno być powiązane tylko z jedną transakcją, a użycie db.session
zapewni, że tak będzie w przypadku Twojej aplikacji.
Weź również pod uwagę, że execute
jest przeznaczony do sparametryzowanych zapytań . Użyj parametrów, takich jak :val
w przykładzie, do wszelkich danych wejściowych do zapytania, aby uchronić się przed atakami iniekcyjnymi SQL. Możesz podać wartość tych parametrów, przekazując dict
jako drugi argument, gdzie każdy klucz jest nazwą parametru wyświetlaną w zapytaniu. Dokładna składnia samego parametru może być różna w zależności od bazy danych, ale wszystkie główne relacyjne bazy danych obsługują je w jakiejś formie.
Zakładając, że jest to SELECT
zapytanie, zwróci iterowalną liczbę RowProxy
obiektów.
Możesz uzyskać dostęp do poszczególnych kolumn za pomocą różnych technik:
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
Osobiście wolę przekonwertować wyniki na 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)
Jeśli nie używasz rozszerzenia Flask-SQLAlchemy, nadal możesz łatwo użyć sesji:
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})