以下函数在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。
答案 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")
答案 1 :(得分:0)
在打开的文件中指定 buffering=2**10。
我认为这是 OSX 上 psycopg2 的问题。我遇到了同样的问题,它在 ubuntu 上运行得非常快。无论数据库是否在 OSX 和 Ubuntu 上,它在 OSX 上都很慢。我的 copy_expert 在 OSX 上花了 13 分钟。当我更改 buffering=2**10 时,它从 13 分钟变为 7 秒。