SQL Alchemy-Sitzungsobjekte haben ihre eigene execute
Methode:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Alle Ihre Anwendungsabfragen sollten ein Sitzungsobjekt durchlaufen, unabhängig davon, ob es sich um unformatiertes SQL handelt oder nicht. Dadurch wird sichergestellt, dass die Abfragen ordnungsgemäß von einer Transaktion verwaltet werden , sodass mehrere Abfragen in derselben Anforderung als eine Einheit festgeschrieben oder zurückgesetzt werden können. Wenn Sie die Transaktion über die Engine oder die Verbindung verlassen , besteht ein viel höheres Risiko für subtile, möglicherweise schwer zu erkennende Fehler, die zu beschädigten Daten führen können. Jede Anforderung sollte nur einer Transaktion zugeordnet sein. Durch die Verwendung db.session
wird sichergestellt, dass dies für Ihre Anwendung der Fall ist.
Beachten Sie auch, dass dies execute
für parametrisierte Abfragen ausgelegt ist . Verwenden Sie Parameter wie :val
im Beispiel für alle Eingaben in die Abfrage, um sich vor SQL-Injection-Angriffen zu schützen. Sie können den Wert für diese Parameter angeben, indem Sie a dict
als zweites Argument übergeben, wobei jeder Schlüssel der Name des Parameters ist, wie er in der Abfrage angezeigt wird. Die genaue Syntax des Parameters selbst kann je nach Datenbank unterschiedlich sein, aber alle wichtigen relationalen Datenbanken unterstützen sie in irgendeiner Form.
Angenommen, es handelt sich um eine SELECT
Abfrage, wird eine iterierbare Anzahl von RowProxy
Objekten zurückgegeben.
Sie können mit verschiedenen Techniken auf einzelne Spalten zugreifen:
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
Persönlich ziehe ich es vor, die Ergebnisse in namedtuple
s umzuwandeln :
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)
Wenn Sie die Flask-SQLAlchemy-Erweiterung nicht verwenden, können Sie dennoch problemlos eine Sitzung verwenden:
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})