SQL Alchemyセッションオブジェクトには独自のexecute
メソッドがあります。
result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})
すべてのアプリケーションクエリは、生のSQLかどうかにかかわらず、セッションオブジェクトを経由する必要があります。これにより、クエリがトランザクションによって適切に管理され、同じリクエスト内の複数のクエリを単一のユニットとしてコミットまたはロールバックできるようになります。エンジンまたは接続を使用してトランザクションの外に出ると、微妙なリスクが高まり、データが破損する可能性のあるバグを検出することが困難になる可能性があります。各リクエストは1つのトランザクションにのみ関連付ける必要がdb.session
あり、これを使用することで、これがアプリケーションに当てはまります。
パラメータ化execute
されたクエリ用に設計されていることにも注意してください。:val
SQLインジェクション攻撃から身を守るために、クエリへの入力には例のようにパラメータを使用してください。これらのパラメーターの値を指定するにdict
は、2番目の引数としてa を渡します。各キーは、クエリに表示されるパラメーターの名前です。パラメータ自体の正確な構文はデータベースによって異なる場合がありますが、すべての主要なリレーショナルデータベースは何らかの形でそれらをサポートしています。
それはだと仮定するとSELECT
、クエリ、これは返される反復可能なのRowProxy
オブジェクトを。
さまざまな手法で個々の列にアクセスできます。
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
個人的には、結果を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)
Flask-SQLAlchemy拡張機能を使用していない場合でも、簡単にセッションを使用できます。
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})