批量更新将是一个upsert命令,就像@imposeren所说的,Postgres 9.5提供了这种能力。我认为Mysql 5.7也可以(参见http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html),这取决于您的确切需求。也就是说,使用db游标可能是最简单的。没什么问题,因为虫子还不够。
沿着这条线的东西应该有用。这是一个伪代码,所以不要只是剪切粘贴,但概念是为你。class GroupByChunk(object):
def __init__(self, size):
self.count = 0
self.size = size
self.toggle = False
def __call__(self, *args, **kwargs):
if self.count >= self.size: # Allows for size 0
self.toggle = not self.toggle
self.count = 0
self.count += 1
return self.toggle
def batch_update(db_results, upsert_sql):
with transaction.atomic():
cursor = connection.cursor()
for chunk in itertools.groupby(db_results, GroupByChunk(size=1000)):
cursor.execute_many(upsert_sql, chunk)
假设如下:db_results是某种结果迭代器,在列表或字典中
来自db_results的结果可以直接馈送到原始sql exec语句中
如果任何批处理更新失败,您将回滚所有更新。如果要将每个块移动到,只需将with块向下推一点