gpt4 book ai didi

django-south - 我可以将架构和数据(南)迁移合二为一吗?

转载 作者:行者123 更新时间:2023-12-03 22:21:55 26 4
gpt4 key购买 nike

我要搬场鸣喇叭它是使用 South 从一个模型到另一个模型的数据:

class Foo(models.Model):
foofield = models.CharField()
honk = models.PositiveIntegerField()

class Bar(models.Model):
barfield = models.CharField()
我以前做过这个,使用 3 个单独的迁移:
  • 架构迁移,添加 鸣喇叭酒吧
  • 一次数据迁移,全部复制 Foo.honk 数据到 Bar.honk
  • 另一个模式迁移,删除 鸣喇叭来自

  • 我可以在一次迁移中完成这三个步骤吗?
    我已经知道 there isn't much of a difference between schema and data migrations in South ,所以我想也许这样的事情可能会奏效(这是上面的三个迁移刚刚合并为一个):
    class Migration(DataMigration):
    def forwards(self, orm):
    # add column
    db.add_column('myapp_bar', 'honk', self.gf('django.db.models.fields.PositiveIntegerField')(default='0'), keep_default=False)

    # copy data
    for foo in Foo.objects.all():
    # find the right bar here and then ...
    bar.honk = foo.honk
    bar.save()

    # remove old column
    db.delete_column('myapp_foo', 'honk')
    这会起作用还是会失败,因为我的(南冰冻) orm 还不知道 Bar.honk?还是我做错了,有一种更好的方法可以在一次迁移中完成这类事情?

    最佳答案

    由于这个问题为我赢得了 Tumbleweed badge ,我自己挖了进去试了一下。这是我发现的。

    不,您不能合并这些迁移

    因为 ORM 卡住仅包含您要迁移到的架构。所以在上面的例子中, foo.honk 在数据迁移期间将无法访问( 循环中的 ),因为它在架构迁移期间被删除,因此它不在卡住的 ORM 中。此外,如果您尝试访问数据,您将获得 DatabaseError 异常,因为数据库中的列尚未与模型中的列匹配(即,如果您尝试访问 db.add_column 之前的任何内容)。

    看起来没有简单的捷径,做这样的事情确实需要上面提到的 3 次迁移。

    关于django-south - 我可以将架构和数据(南)迁移合二为一吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8756212/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com