【发布时间】:2012-09-09 04:26:18
【问题描述】:
我正在使用 bulk_create 将数千行或行加载到 postgresql 数据库中。不幸的是,有些行导致 IntegrityError 并停止了 bulk_create 进程。我想知道是否有办法告诉 django 忽略这些行并尽可能多地保存批处理?
【问题讨论】:
-
这可能是不可能的,因为 PostgreSQL 在第一个错误时中止事务。 Django 需要(a)在每次插入之前创建一个 SAVEPOINT,这会减慢速度并消耗资源;或 (b) 仅当行不存在时才使用过程或查询插入。就个人而言,我会批量插入到一个新的单独表中,可能是
UNLOGGED或TEMPORARY,然后是INSERT INTO realtable SELECT * FROM temptable WHERE NOT EXISTS (SELECT 1 FROM realtable WHERE temptable.id = realtable.id)或类似的。 -
@CraigRinger 好主意,但如果你有更大的模型,那就有点工作
标签: django postgresql bulk-load