使用psycopg2插入多行

时间:2014-04-27 08:43:12

标签: python postgresql psycopg2 python-db-api

根据psycopg2: insert multiple rows with one query,使用psycopg2的execute代替executemany效率更高。其他人可以确认吗?

上面的StackOverflow问题建议使用mogrify来创建排序语句:

INSERT INTO table VALUES (value1, value2), (value3, value4)

是否可以使用常规execute函数生成此类语句?我想到了一些形式

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

会奏效。

更新:

例如,我尝试传递执行sql语句:

insert into history (timestamp) values (%s),(%s); 

与下面的元组:

(('2014-04-27 14:07:30.000000',), ('2014-04-27 14:07:35.000000',))

但我得到的只是错误:

  

无法获取结果

1 个答案:

答案 0 :(得分:5)

要使用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()

不确定executemany的性能差异是否显着。但我认为以上是整洁的。顾名思义,returning子句将返回插入的元组。

BTW timestamp是保留字,不应用作列名。

相关问题