在 1.10 中通过迁移设定数据种子



这个问题有点难以定义,所以请耐心等待。

我有一个名为博客的模型。我有三个迁移。

0001_initial:为博客创建表

0002_seed_data:将一些数据播种到此表中。为了播种这些数据,我使用:

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

0003_add_column:向此表添加新列"标题">

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

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

django.db.utils.OperationalError: (1054, "'field list'中的未知列'Blog.title'"(

对我来说,这看起来像是先有鸡还是先有蛋的问题,因为在表中不存在标题列之前,0002无法运行。在 0003 中,有在表中添加标题的规定,但在0002运行之前无法运行。 一个简单的解决方案是更正顺序。这就是我过去一直在做的事情。但这意味着每次我向此表添加新列时,都必须更正其顺序。

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

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

您尚未显示迁移文件,但我猜您正在从模型文件导入博客类。如您所见,您无法这样做,因为它与迁移过程中此时的数据库状态不同步。

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

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

请参阅有关数据迁移的文档。

您应该使用 SQL 命令来更改 DB 中的任何内容。您可以使用python库,错误即将到来,因为您使用了Django类模型,该模型具有now标题字段,但是当它试图找到该值时没有值,因此最好从SQL查询中获取值,执行要执行的任何操作。

最新更新