如何在postgresql中加快copy_expert?

时间:2019-02-15 12:57:08

标签: python django postgresql sql-update django-queryset

以下函数在111秒内导入约60k条记录。我听说其他人说copy_from和copy_expert在不到一分钟的时间内完成了100万条记录。与使用copy_from相比,使用copy_expert是否会拖慢过程?我可以做些什么来优化它?

cursor = connection.cursor()
cursor.copy_expert('''
COPY employee_employee (name, slug, title, base, overtime, other, gross, benefits, ual, total, year, status, jurisdiction_id, notes)
FROM STDIN WITH (FORMAT csv, HEADER true, FORCE_NOT_NULL (status));
''', open(csv_fname),
)

关于相关变量,数据库连接来自Django(from django.db import connection)。该数据库位于我的本地Macbook Pro上,并且为PostgreSQL10。

2 个答案:

答案 0 :(得分:0)

我建议使用很棒的 django-postgres-copy ,我曾经用它在几秒钟内轻松地将具有约100万行的Som CSV直接导入PostgreSQL。

它是由加利福尼亚市民数据联盟(California Civic Data Coalition)制造的,用于在Django支持PostgreSQL的COPY命令的情况下导入和导出定界数据。

  

“该软件包试图使COPY的使用与Django支持的任何其他数据库例程一样容易。它由自定义模型管理器实现。”

这是将CSV导入数据库表的方式。

from myapp.models import MyModel

MyModel.objects.from_csv("./data.csv", dict(name='NAME', number='NUMBER'))

这是将数据库表导出为CSV的方式。

from myapp.models import MyModel

MyModel.objects.to_csv("./data.csv")

阅读 django-postgres-copy Error msg以获得更多信息。

答案 1 :(得分:0)

在打开的文件中指定 buffering=2**10。

我认为这是 OSX 上 psycopg2 的问题。我遇到了同样的问题,它在 ubuntu 上运行得非常快。无论数据库是否在 OSX 和 Ubuntu 上,它在 OSX 上都很慢。我的 copy_expert 在 OSX 上花了 13 分钟。当我更改 buffering=2**10 时,它从 13 分钟变为 7 秒。