带有简单列表的 psycopg2 executemany?
Posted
技术标签:
【中文标题】带有简单列表的 psycopg2 executemany?【英文标题】:psycopg2 executemany with simple list? 【发布时间】:2013-10-09 20:44:20 【问题描述】:我正在尝试使用 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) 就不能给出一个“简单”的值列表/元组吗?
【问题讨论】:
【参考方案1】:executemany
需要一个序列序列,例如。列表列表:
[[v] for v in values]
【讨论】:
您应该使用元组列表。 psycopg 不正式支持使用带有execute()
和executemany()
的列表。
@fog 不是吗? The docs 状态:“参数可以作为序列或映射提供”。列表和元组都是 Python 中的序列。
@JanneKarila 你(大部分)是对的。最初 psycopg 仅支持元组,并且文档明确提到了这一点。即使在今天,所有execute()
示例除了一个 都显示元组,而不是列表。代码始终支持列表,因为访问是使用PySequence_*()
方法完成的,我们从未明确检查过元组。我仍然更喜欢元组,即使列表被接受,有时我会忘记并且我写了像上面那个误导性的 cmets。 :)【参考方案2】:
executemany()
接受一个参数列表,每个参数应该是一个与execute()
一起使用的对象,即tuple
或dict
,但不是像数字或字符串这样的简单值。这就是为什么第二个版本没问题:您正在生成多个dict
s。你也可以写:
values = [(1,), (2,), (3,)]
其中列表的每个元素都是tuple
。
【讨论】:
以上是关于带有简单列表的 psycopg2 executemany?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Lambda 的 psycopg2 插入 Redshift (Python)
在哪里可以下载带有 psycopg2 for Windows 的二进制鸡蛋?