使用 Django 批量更新

Bulk upsert with Django

bulk_createignore_conflicts=True 仅插入新记录,不更新现有记录。 bulk_update 仅更新现有记录,不插入新记录。

现在我只看到一个变体 upsert 是原始查询:

from catalog.models import Product

with connection.cursor() as cursor:
    cursor.executemany(
        """
        INSERT INTO app_table (pk, col1, col2) 
        VALUES (%s, %s, %s)
        ON DUPLICATE KEY UPDATE 
            col1 = VALUES(col1), 
            col2 = VALUES(col2); 
        """,
        [
            ('1', 'val1', 'val2'),
            ('2', 'val1', 'val2'),
        ]
    )

有没有其他方法可以在 Django 中执行批量更新插入?

MySQL 中没有在单个查询中使用创建和更新的传统方法。我 看到您使用了 INSERT ... ON DUPLICATE KEY UPDATE ,这是在这些情况下的常用方法。另一种冗长的方法:

  • 在临时 table 中更新部分数据,本质上是复制到您的临时 table -> cursor.copy_from(),然后更新到您的原始 table。

此外,您可以通过增加缓存大小来优化性能,如果您不需要日志中的元数据 Ref,则设置 DEBUG=False

也许还可以使用 PostgreSQL 测试相同的数据,并检查它是否会产生更好的性能。