SQL Alchemy oturum nesnelerinin kendi execute
yö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.session
uygulamanı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.:val
dict
Bunun bir SELECT
sorgu olduğunu varsayarsak , bu yinelenebilir bir RowProxy
nesne 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ı namedtuple
s'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})