SQL Alchemy oturum nesnelerinin kendi executeyöntemleri vardır:
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
Tüm uygulama sorgularınız ham SQL olsun veya olmasın bir oturum nesnesinden geçmelidir. Bu, sorguların aynı istekte birden çok sorgunun tek bir birim olarak işlenmesini veya geri alınmasını sağlayan bir işlem tarafından düzgün bir şekilde yönetilmesini sağlar. Motoru veya bağlantıyı kullanarak işlemin dışına çıkmak , sizi daha büyük ince risklere sokar, muhtemelen bozuk verilerle karşılaşmanıza neden olabilecek hataları tespit etmek zordur. Her istek yalnızca bir işlemle ilişkilendirilmelidir ve bunu kullanmak db.sessionuygulamanız için durumun geçerli olmasını sağlayacaktır.
Ayrıca parametreli sorgularexecute için tasarlanmış notları da dikkate alın . Kendinizi SQL enjeksiyon saldırılarına karşı korumak için sorguya yapılan tüm girdiler için örnekte olduğu gibi parametreleri kullanın . A İkinci argüman olarak ileterek bu parametreler için değer sağlayabilirsiniz; burada her anahtar, sorguda göründüğü şekliyle parametrenin adıdır. Parametrenin kendisinin tam sözdizimi, veritabanınıza bağlı olarak farklı olabilir, ancak tüm önemli ilişkisel veritabanları bunları bir biçimde destekler.:valdict
Bunun bir SELECTsorgu olduğunu varsayarsak , bu yinelenebilir bir RowProxynesne döndürür .
Sütunlara çeşitli tekniklerle erişebilirsiniz:
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
Şahsen, sonuçları namedtuples'ye dönüştürmeyi tercih ederim :
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)
Flask-SQLAlchemy uzantısını kullanmıyorsanız, yine de kolayca bir oturum kullanabilirsiniz:
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})