私はsqlalchemyを使用して生のsqlクエリを実行しようとしていますが、それを行うための「適切な」方法は何だろうと思います。
私のクエリは次のようになります(今のところ)。
db.my_session.execute(
"""UPDATE client SET musicVol = {}, messageVol = {}""".format(
music_volume, message_volume))
私が気に入らないのは、文字列のフォーマットとパラメーター処理の欠如です(music_volume :-Dの引用符にこんにちは)。
私はこの答えに従ってみました:
SQLAlchemy-flaskアプリで生のSQLを実行する方法
そして、私が読んだものを適用した後、私のスニペットは次のようになります:
db.my_session.execute(
"UPDATE client SET musicVol = :mv , messageVol = :ml", mv=music_volume, ml=message_volume)
ただし、mvとmlがパラメーターとして認識されないというエラーが発生します。
私のスニペットをこれに変更すると、うまくいきます:
db.my_session.execute(
"UPDATE client SET musicVol = :mv , messageVol = :ml", {mv: music_volume, ml: message_volume})
最後に、my_sessionがdb.pyというファイルでそのように開始されます。
engi = sqlalchemy.create_engine(
'mysql://{user}:{passwd}@{Host}/{db}'.format(
Host=settings.Host,
user=settings.USER,
passwd=settings.PASS,
db=settings.DB_NAME), execution_options={
'autocommit': True,
})
my_session = sqlalchemy.orm.scoped_session(sqlalchemy.orm.sessionmaker(bind=engi), scopefunc=os.getpid)
sqlalchemy.orm.scoped_session.configure(my_session, autocommit=True)
私が知りたいのは、上記のリンクとドキュメントのこの部分に答える理由です。
http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#using-text
実際に私のために働いているものに対して少し異なる解決策を示しています。
私のアプローチが行くものである場合にも。
mv
とml
はどちらも変数として定義していないため、認識されません。
execute
ステートメントの2番目の引数は辞書であり、プレーンクエリのすべての要素"UPDATE client SET musicVol = :mv , messageVol = :ml"
コロンでエスケープされたものが、この辞書のキーで検索されています。 execute
メソッドでキーが見つかりませんでした'mv'
または'ml'
この辞書では、エラーが発生します。
これは正しいバージョンです:
db.my_session.execute(
"UPDATE client SET musicVol = :mv, messageVol = :ml",
{'mv': music_volume, 'ml': message_volume}
)