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 中执行批量更新插入吗?
bulk_create
方法通过 update_conflicts
支持upserts:
MyModel.objects.bulk_create(
queryset,
update_conflicts=True,
update_fields=['col1', 'col2'],
unique_fields=['col3'],
)
MySQL 中没有在单个查询中使用创建和更新的传统方法。我 请注意,您已经使用了
INSERT ... ON DUPLICATE KEY UPDATE
,这是这些情况下的常见方法。另一种冗长的方法:
cursor.copy_from()
,然后更新到原始表。此外,您可以通过增加缓存大小来优化性能,如果您的日志中不需要元数据
Ref,则可以设置
DEBUG=False
。
也许还可以使用 PostgreSQL 测试相同的数据,并检查它是否会带来更好的性能。
Mysql有REPLACE INTO功能,对于替换数据和避免违反约束非常有用 https://dev.mysql.com/doc/refman/8.0/en/replace.html