4

単純なマルチ挿入に psycopg2 executemany を使用しようとしていますが、値の「プレーンな」シーケンスではなく、dict を使用してのみ機能させることができます。

# given:
values = [1, 2, 3] ; cursor = conn.cursor()

# this raises TypeError: 'int' object does not support indexing:
cursor.executemany('INSERT INTO t (col_a) VALUES ( %s )', values)
# I also tried encapsulating my 'values' into a tuple/list but it gives another exception (TypeError: not all arguments converted during string formatting).

# while this is ok:
cursor.executemany('INSERT INTO t (col_a) VALUES ( %(value)s )', [  dict(value=v) for v in values ])

「名前付き」パラメーター (%(value)s) を使用せずに、値の「単純な」リスト/タプルを与えることはできませんか?

4

2 に答える 2

6

executemanyシーケンスのシーケンスを期待します。リストのリスト:

[[v] for v in values]
于 2013-10-03T08:43:20.820 に答える
3

executemany()はパラメータのリストを取り、各パラメータは で動作するオブジェクトexecute()、つまり atupleまたは adictである必要がありますが、数値や文字列のような単純な値ではありません。そのため、2 番目のバージョンは問題ありません。複数dictの を生成しています。次のように書くこともできます。

values = [(1,), (2,), (3,)]

リストの各要素はtupleです。

于 2013-10-03T08:44:29.940 に答える