迁移 Django 固定装置?
Posted
技术标签:
【中文标题】迁移 Django 固定装置?【英文标题】:Migrating Django fixtures? 【发布时间】:2011-04-29 11:24:10 【问题描述】:我有一个 Django 应用程序。我有包含测试数据的 .json 夹具文件,单元测试使用数据来确认应用程序是否正常工作。我也使用 South 来迁移我的数据库。
做了几次数据库迁移后,我的fixtures已经过时了,因为数据库已经迁移,例如添加了一个新的数据库列,而fixture数据没有那个列,因为它是在数据库之前捕获的改变了。
在我迁移数据库时,将我的固定装置向前移动的最佳方式是什么?
【问题讨论】:
【参考方案1】:这是我使用的过程:
将代码回滚到最初创建夹具的版本。例如:svn up -r12345
。
清空数据库,然后用manage.py syncdb --noinput --migrate
创建它
用manage.py loaddata my_fixture.json
加载夹具
将代码向前滚动到现在,svn up
使用manage.py migrate
迁移数据库
使用manage.py dumpdata --indent=2 myapp >my_fixture.json
转储数据
请注意,在选择要回滚到的过去版本时需要小心。就我而言,我最近有一些修复需要到位,所以我实际上必须挑选目录来回滚到特定的修订。单调乏味,但比手动编辑 9,000 行 JSON 文件要好。
此外,在第 6 步中,请务必转储正确的应用程序集。
将来,当我编写迁移时,我可以再次执行这些步骤以使所有固定装置保持最新。
【讨论】:
我也有类似的情况,虽然我刚刚开始,希望采用测试优先的方法。整个“清空数据库、加载测试夹具、迁移、转储测试夹具”过程将扼杀工作流程。希望其他人会建议(或编码;-))更优雅的解决方案。 请注意,如果您先回滚,您最终会得到当时的灯具。这意味着两者之间的任何更改都将被丢弃。如果手动更新了任何东西,它将被取消,所以我倾向于将灯具复制到其他地方,然后回滚,加载移动的灯具,快进,迁移等......【参考方案2】:您为什么不能简单地从您的数据库中创建一个新的.json
文件。当我需要创建一个新的灯具时,我会这样做。
python manage.py dumpdata <your_app> auth > test_data.json
【讨论】:
因为我的测试数据是一个受控样本,而不仅仅是我的生产数据库的最新快照。【参考方案3】:在我迁移数据库时,将我的固定装置向前移动的最佳方式是什么?
为时已晚。
迁移数据库时,您需要loaddata
和dumpdata
。
它停止工作,为时已晚。
一个可能的后备方案是编写一个简短的脚本来将 JSON 固定装置加载到内存中, 然后“手动”构建数据库对象。
with open( "somefile.json", "r" ) as data:
for obj in json.load( data ):
if obj['model'] == 'someapp.somemodel':
SomeNewModel.objects.create(
field = obj['fields']['element']
...
)
按照这些思路,您也许可以使用当前架构和旧设备来构建数据库。
【讨论】:
谢谢,但我不相信现在为时已晚。我总是可以将我的代码和/或我的数据库回滚到以前的状态,所以我确信我可以回到正确的轨道上。您能否提供更多有关 loaddata/dumpdata 工作原理的详细信息?例如,我假设中间有迁移。但是,如果我的夹具仅适用于一个应用程序,South 怎么知道应用迁移? @Ned Batchelder:“我总是可以将我的代码和/或我的数据库回滚到以前的状态,”虽然是这样,但这太复杂了。真的太晚了。请阅读此内容以获取 loaddata 和 dumpdata:docs.djangoproject.com/en/dev/ref/django-admin. 如果 South 要迁移灯具,这将是一个杀手级功能。 您可以编写加载 django.core.management 并运行 loaddata 命令的数据迁移,但是....随着架构的变化,您可能会遇到一个痛苦的世界,但固定装置不会.我建议使用带有 ./manage.py dumpdata foo bar baz.MySpecialModel 等的 Makefile,这样您就可以在创建新迁移后轻松更新您的设备并将它们提交到您的源代码管理。以上是关于迁移 Django 固定装置?的主要内容,如果未能解决你的问题,请参考以下文章