首页 > 解决方案 > 带有列表的 Psycopg2 插入语句

问题描述

我正在阅读 psycopg2 的文档:http: //initd.org/psycopg/docs/usage.html 在该文档之后,哪些插入语句被认为是正确的?

  1. cur.execute ('INSERT INTO tb VALUES (%s, %s)', row[0:2])

  2. cur.execute ('INSERT INTO tb VALUES (%s, %s)', (row[0:2]) )

其中“row”是 5 个元素的列表,“tb”是包含 2 列的表。

标签: pythonpostgresqlpsycopg2

解决方案


这些实际上是同一件事,因为简单地将括号括起来并不能使其成为元组。您还需要一个尾随逗号,例如:(row[0:2],)

In [1]: row = [1,2,3]                                                             

In [2]: row[0:2]                                                                  
Out[2]: [1, 2]

In [3]: (row[0:2])                                                                
Out[3]: [1, 2]

In [4]: (row[0:2],)                                                               
Out[4]: ([1, 2],)

但是要回答我认为您要问的问题:根据DB-API 的文档,.execute()第一种选择是正确的:“参数可以作为序列或映射提供......”

cur.execute('INSERT INTO tb VALUES (%s, %s);', row[0:2])

换句话说,您提供了一个序列(在这种情况下是一个列表);而不是一个序列的序列:一个列表的元组,再次看起来像这样(row[0:2],):注意结尾的逗号。


推荐阅读