Psycopg2,Postgresql,Python:批量插入的最快方法

Ada*_*tan 40 python postgresql psycopg2

我正在寻找将数百万个元组批量插入数据库的最有效方法.我正在使用Python,PostgreSQL和psycopg2.

我创建了一个很长的郁金香列表,应该插入到数据库中,有时使用几何修饰符Simplify.

这种天真的方式是使用字符串格式化INSERT语句列表,但我还读到了其他三种方法:

  1. 使用pyformat绑定样式进行参数化插入
  2. executemany在元组列表中使用,和
  3. 使用将结果写入文件并使用COPY.

似乎第一种方式是最有效的,但我很感激您的见解和代码片段告诉我如何正确地做到这一点.

And*_*lam 14

是的,我会投票给COPY,假设您可以将文件写入服务器的硬盘驱动器(而不是应用程序运行的驱动器),因为COPY只能读取服务器.

  • 使用psycopg2的cursor.copy_from文件由客户端处理.它甚至不需要是文件系统文件:任何类似python文件的对象都可以正常工作.查看http://initd.org/psycopg/docs/cursor.html#cursor.copy_from (20认同)
  • 它也可以从`STDIN`读取,这意味着数据来自客户端应用程序.请参阅copy命令文档:http://www.postgresql.org/docs/8.4/static/sql-copy.html (5认同)
  • 使用`copy`服务器端很难超越速度. (2认同)

pir*_*iro 10

有一个新的psycopg2手册,其中包含所有选项的示例.

COPY选项是最有效的.然后是executemany.然后用pyformat执行.


Fla*_*hDD 8

根据我的经验executemany,并不比自己运行多个插件快,最快的方法是自己格式化一个INSERT具有很多值的单个,也许将来executemany会有所改进但是现在它很慢

我将a子类化list并重载append方法,因此当列表达到一定大小时,我会格式化INSERT来运行它


Mik*_*che 8

插入许多项目的最新方法是使用execute_values助手(https://www.psycopg.org/docs/extras.html#fast-execution-helpers)。

from psycopg2.extras import execute_values

insert_sql = "INSERT INTO table (id, name, created) VALUES %s"
# this is optional
value_template="(%s, %s, to_timestamp(%s))"

cur = conn.cursor()

items = []
items.append((1, "name", 123123))
# append more...

execute_values(cur, insert_sql, items, value_template)
conn.commit()
Run Code Online (Sandbox Code Playgroud)


Sea*_*ere 6

您可以使用新的upsert库:

$ pip install upsert
Run Code Online (Sandbox Code Playgroud)

(你可能pip install decorator要先)

conn = psycopg2.connect('dbname=mydatabase')
cur = conn.cursor()
upsert = Upsert(cur, 'mytable')
for (selector, setter) in myrecords:
    upsert.row(selector, setter)
Run Code Online (Sandbox Code Playgroud)

哪里selectordict喜欢的对象{'name': 'Chris Smith'},并setterdict{ 'age': 28, 'state': 'WI' }

几乎与编写自定义INSERT [/ UPDATE]代码并直接用psycopg2... 运行它一样快,如果该行已存在则不会爆炸.

  • 现在,您应该使用内部PostgreSQL实现(需要9.5+版本),其中包括使用`INSERT [...] ON CONFLICT [...]`https://www.postgresql.org/docs/9.5/static /sql-insert.html (6认同)