web-dev-qa-db-ja.com

Sqlalchemy、生のクエリとパラメーター

私は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

実際に私のために働いているものに対して少し異なる解決策を示しています。

私のアプローチが行くものである場合にも。

10
Drachenfels

mvmlはどちらも変数として定義していないため、認識されません。

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}
)
18
mpiskore