47

パフォーマンス上の理由から、次の SQL を使用しています。

 sql_tmpl = """delete from Data where id_data in (:iddata) """
 params = {
                    'iddata':[1, 2,3 4],
                    }

 # 'session' is a session object from SQLAlchemy
 self.session.execute(text(sql_tmpl), params)

ただし、例外があります。

NotSupportedError: (NotSupportedError) ('Python type list not supported.  param=1', 'HY097')

リストを「in」句のパラメータにバインドできる回避策はありますか?

4

9 に答える 9

34

psycopg2は型適応をサポートするようになりました。これにより、とりわけ、クエリで単一のパラメーター化された値にリストを渡すことができます。これは SQLAlchemy でも機能し、少なくとも PostgreSQL データベースへの生の SQL 風のクエリに対しては機能します (私は他のデータベース タイプにアクセスできないため、sqlalchemy他のデータベースに対してこの慣習を尊重するかどうかはわかりませんが、私の必要な傾斜の引用は、それが機能するということです)。

some_ids = [1, 2, 3, 4]
query = "SELECT * FROM my_table t WHERE t.id = ANY(:ids);"
conn.execute(sqlalchemy.text(query), ids=some_ids)
## runs just fine

へのラッパー呼び出しがないとsqlalchemy.textProgrammingError: syntax error at or near ":".

于 2016-09-09T14:45:22.200 に答える
9

括弧なしで試してみてください:iddata。それは私のために働いています。

sql_tmpl = """delete from Data where id_data in :iddata """
于 2014-07-15T07:50:36.123 に答える
3

私の知る限り、どの SQL エンジンも配列パラメーターを渡すことを許可していません。SQLAlchemy がこれを処理する方法は、配列内の各項目にパラメーターを渡すことです。

>>> from sqlalchemy.sql import table, column
>>> print(table('Data').delete(column('id_data').in_([5, 6, 7,])))
DELETE FROM "Data" WHERE id_data IN (:id_data_1, :id_data_2, :id_data_3)

SQLAlchemy 式構造を使用しない場合は、これを手動で行う必要があります。

于 2012-11-02T10:04:10.197 に答える
0

ループを使用して where 句を生成し、** を使用して query.execute パラメーターのリストを分割できます。例を次に示します: https://gist.github.com/pawl/555e5eecce77d4de0ada

于 2014-08-06T18:56:32.083 に答える