带有简单列表的 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() 一起使用的对象,即tupledict,但不是像数字或字符串这样的简单值。这就是为什么第二个版本没问题:您正在生成多个dicts。你也可以写:

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

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

【讨论】:

以上是关于带有简单列表的 psycopg2 executemany?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Lambda 的 psycopg2 插入 Redshift (Python)

带有 psycopg2 抛出错误的 unnest

在哪里可以下载带有 psycopg2 for Windows 的二进制鸡蛋?

使用带有 psycopg2 的二进制 COPY 表 FROM

从执行存储过程的psycopg2游标中获取列名列表?

python psycopg2选择时区的current_timestamp问题