Gli oggetti sessione Alchemy SQL hanno il loro execute
metodo:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Tutte le query dell'applicazione dovrebbero passare attraverso un oggetto sessione, siano esse SQL grezzo o meno. Ciò garantisce che le query siano gestite correttamente da una transazione , il che consente di eseguire il commit o il rollback di più query nella stessa richiesta come una singola unità. Uscire dalla transazione utilizzando il motore o la connessione ti espone a un rischio molto maggiore di bug sottili, forse difficili da rilevare, che possono lasciarti con dati danneggiati. Ogni richiesta deve essere associata a una sola transazione e utilizzodb.session
garantirà che ciò per l'applicazione.
Si noti inoltre che execute
è progettato per query con parametri . Usa parametri, come:val
nell'esempio, per qualsiasi input alla query per proteggersi dagli attacchi SQL injection. È possibile fornire il valore per questi parametri passando adict
come secondo argomento, dove ogni chiave è il nome del parametro come appare nella query. L'esatta sintassi del parametro stesso può variare a seconda del database, ma tutti i principali database relazionali li supportano in qualche modo.
Supponendo che sia una SELECT
query, questo restituirà un iterabile diRowProxy
oggetti.
Puoi accedere alle singole colonne con una varietà di tecniche:
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
Personalmente, preferisco convertire i risultati in 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)
Se non si utilizza l'estensione Flask-SQLAlchemy, è comunque possibile utilizzare facilmente una sessione:
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})