Ada*_*tan 40 python postgresql psycopg2
我正在寻找将数百万个元组批量插入数据库的最有效方法.我正在使用Python,PostgreSQL和psycopg2.
我创建了一个很长的郁金香列表,应该插入到数据库中,有时使用几何修饰符Simplify.
这种天真的方式是使用字符串格式化INSERT语句列表,但我还读到了其他三种方法:
pyformat绑定样式进行参数化插入executemany在元组列表中使用,和COPY.似乎第一种方式是最有效的,但我很感激您的见解和代码片段告诉我如何正确地做到这一点.
And*_*lam 14
是的,我会投票给COPY,假设您可以将文件写入服务器的硬盘驱动器(而不是应用程序运行的驱动器),因为COPY只能读取服务器.
根据我的经验executemany,并不比自己运行多个插件快,最快的方法是自己格式化一个INSERT具有很多值的单个,也许将来executemany会有所改进但是现在它很慢
我将a子类化list并重载append方法,因此当列表达到一定大小时,我会格式化INSERT来运行它
插入许多项目的最新方法是使用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)
您可以使用新的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)
哪里selector是dict喜欢的对象{'name': 'Chris Smith'},并setter是dict像{ 'age': 28, 'state': 'WI' }
它几乎与编写自定义INSERT [/ UPDATE]代码并直接用psycopg2... 运行它一样快,如果该行已存在则不会爆炸.
| 归档时间: |
|
| 查看次数: |
27872 次 |
| 最近记录: |