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或 a dict,但不是像数字或字符串这样的简单值。这就是为什么第二个版本可以的原因:您正在生成多个dicts. 你也可以只写:

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

其中列表的每个元素都是一个tuple.

于 2013-10-03T08:44:29.940 回答