使用 Django 批量更新
Bulk upsert with Django
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 中执行批量更新插入?
MySQL 中没有在单个查询中使用创建和更新的传统方法。我
看到您使用了 INSERT ... ON DUPLICATE KEY UPDATE
,这是在这些情况下的常用方法。另一种冗长的方法:
- 在临时 table 中更新部分数据,本质上是复制到您的临时 table ->
cursor.copy_from()
,然后更新到您的原始 table。
此外,您可以通过增加缓存大小来优化性能,如果您不需要日志中的元数据 Ref,则设置 DEBUG=False
。
也许还可以使用 PostgreSQL 测试相同的数据,并检查它是否会产生更好的性能。
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 中执行批量更新插入?
MySQL 中没有在单个查询中使用创建和更新的传统方法。我
看到您使用了 INSERT ... ON DUPLICATE KEY UPDATE
,这是在这些情况下的常用方法。另一种冗长的方法:
- 在临时 table 中更新部分数据,本质上是复制到您的临时 table ->
cursor.copy_from()
,然后更新到您的原始 table。
此外,您可以通过增加缓存大小来优化性能,如果您不需要日志中的元数据 Ref,则设置 DEBUG=False
。
也许还可以使用 PostgreSQL 测试相同的数据,并检查它是否会产生更好的性能。