通过迁移1.10播种数据

时间:2018-06-19 11:49:43

标签: django django-migrations django-1.10

这个问题很难定义,请耐心等待。

我有一个称为Blog的模型。我有三个迁移。

0001_initial :为Blog创建表

0002_seed_data :将一些数据播种到该表中。要播种此数据,我使用:

all_blogs = Blog.objects.all()
 for blog in all_blogs.iterator():
  #some logic here
  blog.save()

0003_add_column :向该表添加新列“ title”

当我在过去已经运行过 0002_seed_data 的数据库上运行 0003_add_column 时,它可以工作。

但是,当我在空数据库上运行这些迁移时,它在 0002_seed_data 处失败,因为它无法在数据库中找到标题。它给出类似于以下内容的错误:

django.db.utils.OperationalError:(1054,““字段列表”中的未知列“ Blog.title””))

在我看来,这就像鸡到蛋的问题,因为 0002 不能运行,直到表中没有标题列。可以在 0003 的表中添加标题,但是只有在 0002 运行后才能运行。 一个简单的解决方案是更正顺序。这是我过去一直在做的事情。但这意味着每次我向该表添加新列时,都必须更正其顺序。

快速搜索错误将返回一些解决方案,其中大多数解决方案都涉及删除所有迁移并使用makemigrations重新进行。这不会解决我的问题

那么有没有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

您还没有显示迁移文件,但是我想您是从模型文件中导入Blog类的。如您所见,您无法做到这一点,因为它与迁移过程中此时的数据库状态不同步。

幸运的是,Django迁移支持“历史”模型,这些模型根据db的状态正确表示了模型。无需导入模型,而是通过调用apps.get_model()在RunPython函数中以编程方式获取模型。所以:

def my_function(apps, schema_editor):
    Blog = apps.get_model('myapp', 'Blog')
    all_blogs = Blog.objects.all()
    ...

请参阅data migrations上的文档。

答案 1 :(得分:-1)

您应该使用SQL命令更改数据库中的任何内容。您可以使用python库,但由于使用Django类模型(现在具有title字段)的错误来了,但是当它当时试图查找该值时没有任何值,因此最好从SQL查询中获取该值,执行您要对此执行的任何操作。