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