Obiekty sesji Alchemia SQL mają własną executemetodę:
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.sessionzapewni, że tak będzie w przypadku Twojej aplikacji.
Weź również pod uwagę, że executejest przeznaczony do sparametryzowanych zapytań . Użyj parametrów, takich jak :valw 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 dictjako 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 SELECTzapytanie, zwróci iterowalną liczbę RowProxyobiektó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 namedtuples:
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})