跨表的南数据迁移更新

时间:2015-01-16 08:58:41

标签: django orm django-south data-migration

我有这个迁移:

book_metas = orm.DigitalProductFormat.objects.exclude(image__isnull=True)
    for book_meta in book_metas:
        book_meta.checksum = book_meta.image.checksum
        book_meta.save()

如果图书有图像,则将校验和从图像移动到图书。有近1,000,000本书,这种迁移将永远存在。有没有一种很好的方法来减少我必须调用保存的次数

我查看了使用Django的queryset更新方法,但似乎无法跨表工作。

任何建议都将不胜感激

1 个答案:

答案 0 :(得分:1)

执行此迁移的最快方法是使用原始SQL查询。

我不知道您的数据库是否支持UPDATE ... FROM ... JOIN语法,但以下UPDATE ... SELECT几乎可以在每个数据库服务器上运行。

from south.db import db
db.execute("""
    UPDATE app_digitalproductformat
    SET checksum = (SELECT checksum FROM app_image
                    WHERE app_image.id=app_digitalproductformat.image_id)
    WHERE image_id IS NOT NULL
           """)

app是您的django应用程序的名称。