Python 使用psycopg2插入多行

Python 使用psycopg2插入多行,python,postgresql,psycopg2,python-db-api,Python,Postgresql,Psycopg2,Python Db Api,据介绍,使用psycopg2而不是其他的方法更有效。其他人能证实吗 上面的StackOverflow问题建议使用创建以下类型的语句: INSERT INTO table VALUES (value1, value2), (value3, value4) 是否可以使用正则函数生成这样的语句?我想到了一些形式上的东西 cursor.execute("""INSERT INTO table VALUES (%s, %s), (%s, %s)""", ((value1,value2),(value3,

据介绍,使用psycopg2而不是其他的方法更有效。其他人能证实吗

上面的StackOverflow问题建议使用创建以下类型的语句:

INSERT INTO table VALUES (value1, value2), (value3, value4)
是否可以使用正则函数生成这样的语句?我想到了一些形式上的东西

cursor.execute("""INSERT INTO table VALUES (%s, %s), (%s, %s)""", ((value1,value2),(value3,value4)))
会有用的

更新:

例如,我尝试传递到execute sql语句:

insert into history (timestamp) values (%s),(%s); 
使用以下元组:

(('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',))
但我得到的只是一个错误:

没有要获取的结果


要使用execute方法,请将要插入的数据放置在列表中。psycopg2将根据阵列调整列表。然后根据需要取消数组的测试并强制转换值

import psycopg2

insert = """
    insert into history ("timestamp")
    select value
    from unnest(%s) s(value timestamp)
    returning *
;"""

data = [('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',)]
conn = psycopg2.connect("host=localhost4 port=5432 dbname=cpn")
cursor = conn.cursor()
cursor.execute(insert, (data,))
print cursor.fetchall()
conn.commit()
conn.close()
不确定与ExecuteMay的性能差异是否显著。但我觉得上面的比较整洁。顾名思义,returning子句将返回插入的元组


顺便说一句,timestamp是一个保留字,不应用作列名。

您没有先尝试此操作吗?多值插入确实比psycopg2中的executemany更有效,尽管只是在一定程度上-如果您在每条语句中插入数万行,内存使用就会成为一个问题。如果行较小,则成批处理几百或几千行就可以了。+1表示“unnest”,并指出“timestamp”问题,这是使用ORM的遗留问题。在postgres中,似乎没有保留“timestamp”。在select中不需要列名。这同样有效:插入到我的表col1,col2从unest%s scol1 integer中选择*,col2文本返回*;