使用 Django 批量更新插入

问题描述 投票:0回答:3

bulk_create

ignore_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 中执行批量更新插入吗?

python mysql django upsert
3个回答
4
投票

从 Django 4.1 开始,

bulk_create
方法通过 update_conflicts
 支持 
upserts
:

MyModel.objects.bulk_create(
    queryset, 
    update_conflicts=True, 
    update_fields=['col1', 'col2'],
    unique_fields=['col3'],
)

1
投票

MySQL 中没有在单个查询中使用创建和更新的传统方法。我 请注意,您已经使用了

INSERT ... ON DUPLICATE KEY UPDATE
,这是这些情况下的常见方法。另一种冗长的方法:

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

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

Ref
,则可以设置DEBUG=False

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


0
投票

Mysql有REPLACE INTO功能,对于替换数据和避免违反约束非常有用 https://dev.mysql.com/doc/refman/8.0/en/replace.html

© www.soinside.com 2019 - 2024. All rights reserved.