いいえ、SQLパラメータはスカラーのみを処理します 値。ここでSQLを生成する必要があります。生のSQLが必要な場合は、以下を使用してください:
statement = "SELECT * FROM table WHERE `key`='rating' AND uid IN ({})".format(
', '.join([':i{}'.format(i) for i in range(len(some_list))]))
my_sess.execute(
statement,
params={'i{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()
例えば some_list
のすべての値を保持するのに十分なパラメータを生成します 文字列フォーマットを使用して、一致するパラメータを生成してそれらを埋めます。
さらに、 literal_column()
オブジェクト
すべての生成を行うには:
from sqlalchemy.sql import literal_column
uid_in = literal_column('uid').in_(some_list)
statement = "SELECT * FROM able WHERE `key`='rating' AND {}".format(uid_in)
my_sess.execute(
statement,
params={'uid_{}'.format(i): v for i, v in enumerate(some_list)})
).fetchall()
ただし、複数のデータベースダイアレクトのサポートがはるかに簡単になるため、`sqlalchemy.sql.expressionモジュールを使用してステートメント全体を生成することもできます。
さらに、 uid_in
オブジェクトは、バインドパラメータの正しい値への参照をすでに保持しています。 str.format()
のように文字列に変換するのではなく、 上記のアクションでは、SQLAlchemyには実際のオブジェクトと関連するパラメーターが含まれ、 params
を生成する必要がなくなります。 辞書どちらか 。
以下が機能するはずです:
from sqlalchemy.sql import table, literal_column, select
tbl = table('table')
key_clause = literal_column('key') == 'rating'
uid_clause = literal_column('uid').in_(some_list)
my_sess.execute(select('*', key_clause & uid_clause, [tbl]))
ここで、sqlalchemy.sql。 select()
列の仕様を取得します(ここでは *
にハードコードされています )、where句(&
の2つの句から生成されます SQL AND
を生成します 条項)および選択可能なもののリスト。ここにあなたのもの sqlalchemy.sql .table()
価値。
クイックデモ:
>>> from sqlalchemy.sql import table, literal_column, select
>>> some_list = ['foo', 'bar']
>>> tbl = table('table')
>>> key_clause = literal_column('key') == 'rating'
>>> uid_clause = literal_column('uid').in_(some_list)
>>> print select('*', key_clause & uid_clause, [tbl])
SELECT *
FROM "table"
WHERE key = :key_1 AND uid IN (:uid_1, :uid_2)
ただし、これらすべてから生成された実際のオブジェクトツリーには、バインドパラメータの実際の値も含まれているため、 my_sess.execute()
これらに直接アクセスできます。