Les objets de session SQL Alchemy ont leur propre execute
méthode:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Toutes vos requêtes d'application doivent passer par un objet session, qu'elles soient SQL brut ou non. Cela garantit que les requêtes sont correctement gérées par une transaction , ce qui permet à plusieurs requêtes dans la même demande d'être validées ou annulées en une seule unité. Sortir de la transaction en utilisant le moteur ou la connexion vous expose à un risque beaucoup plus important de bogues subtils, éventuellement difficiles à détecter, qui peuvent vous laisser des données corrompues. Chaque demande doit être associée à une seule transaction, et l'utilisation db.session
garantira que c'est le cas pour votre application.
Notez également qu'il execute
est conçu pour les requêtes paramétrées . Utilisez des paramètres, comme :val
dans l'exemple, pour toutes les entrées de la requête pour vous protéger des attaques par injection SQL. Vous pouvez fournir la valeur de ces paramètres en passant a dict
comme deuxième argument, où chaque clé est le nom du paramètre tel qu'il apparaît dans la requête. La syntaxe exacte du paramètre lui-même peut être différente selon votre base de données, mais toutes les principales bases de données relationnelles les prennent en charge sous une forme ou une autre.
En supposant que c'est une SELECT
requête, cela retournera un itérable d' RowProxy
objets.
Vous pouvez accéder à des colonnes individuelles avec une variété de techniques:
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
Personnellement, je préfère convertir les résultats en 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)
Si vous n'utilisez pas l'extension Flask-SQLAlchemy, vous pouvez toujours utiliser facilement une session:
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})