【问题标题】:psycopg2 executemany with simple list?带有简单列表的 psycopg2 executemany?
【发布时间】: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) 就不能给出一个“简单”的值列表/元组吗?

【问题讨论】:

    标签: python psycopg2 executemany


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 2010-09-28
      • 1970-01-01
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多