Django South 模式迁移与数据预加载

3 投票
2 回答
527 浏览
提问于 2025-04-18 04:48

这个问题是我有一个正在正常运行的Django项目。

我需要进行两个数据库结构的更改,分别是A和B。

出于某种原因,我需要在应用迁移A之后加载一些数据到数据库,然后再应用迁移B。

当然,我可以手动完成这一步。比如:

./manage.py migrate my_app 0001
./manage.py loaddata my_fixture.json
./manage.py migrate my_app 0002

这样做是没问题的。

不过,在生产环境中,我希望能通过脚本自动部署我的项目,不想添加太多手动步骤。

我理想的解决方案是,在我进行数据库结构更改后,能够自动填充我的数据(也许可以通过一些特殊的选项参数)。

有没有人知道怎么做到这一点?

附注:我可能没有提供足够的信息。如果你觉得我的问题太模糊,请留言告诉我,我会看看能否让问题更清楚。

更新: 我已经标记Serafeim的回答为正确答案。Robert Jørgensgaard Engdahl提到的一个要点,可以在下面的帖子中详细解释: django在向后迁移后从数据文件加载数据 / loaddata使用的是模型结构而不是数据库结构

不过,我们的问题并不完全相同。我的结构A是创建一个新表,并且在可预见的未来不会改变。迁移B是向另一个表添加一个新列,这个新列指向A创建的表。这就是我需要在新表中预先填充一些数据的原因(出于一些复杂的原因,我不想详细解释)。我已经测试了Serafeim的解决方案,它是有效的。

然而,如果有人遇到类似的情况,请查看Robert Jørgensgaard Engdahl分享的帖子,以了解在采取这个解决方案之前的缺点。再次感谢两位回答者!

2 个回答

0

在进行数据库迁移时,添加新行应该谨慎对待。这是因为这样会让你无法“重置”迁移,也就是说,如果你想发布一个没有任何ORM(对象关系映射)变化的版本,但又想把所有的迁移都替换成最初的0001_initial迁移,就做不到了。在长期运行的项目中,你希望能保留这个选项。

0

你应该使用南方数据迁移工具:

http://south.readthedocs.org/en/latest/tutorial/part3.html#data-migrations

南方工具已经有加载你数据的办法,具体可以参考这里:http://south.readthedocs.org/en/latest/fixtures.html

在你创建了迁移文件 0001 后,接着创建一个空的迁移文件,用来加载你的数据:

./manage.py datamigration appname load_myfixture

然后,在 0002_load_myfixture.py 这个迁移模块中,像这样修改 forwards 迁移:

def forwards(self, orm):
    from django.core.management import call_command
    call_command("loaddata", "my_fixture.json")

你不需要实现 backwards 迁移。

撰写回答