我有一个Django应用程序 . 我有包含测试数据的.json fixture文件,单元测试使用数据来确认应用程序是否正常工作 . 我还使用South来迁移我的数据库 .
在进行了一些数据库迁移之后,我的数据库已经过时了,因为数据库已经迁移,例如添加了一个新的数据库列,并且fixture数据没有该列,因为它是在数据库更改之前捕获的 .
在迁移数据库时,移动我的灯具的最佳方法是什么?
这是我使用的过程:
首先将代码回滚到创建夹具的修订版 . 例如: svn up -r12345 .
svn up -r12345
清空数据库,然后使用 manage.py syncdb --noinput --migrate 创建它
manage.py syncdb --noinput --migrate
用 manage.py loaddata my_fixture.json 加载夹具
manage.py loaddata my_fixture.json
将代码转发到现在,使用 svn up
svn up
使用 manage.py migrate 迁移数据库
manage.py migrate
使用 manage.py dumpdata --indent=2 myapp >my_fixture.json 转储数据
manage.py dumpdata --indent=2 myapp >my_fixture.json
请注意,在选择要回滚的过去修订时需要小心 . 在我的情况下,我有一些最近的修复需要到位,所以我实际上必须选择目录以回滚到特定的修订 . 单调,但比手动编辑9,000行JSON文件更好 .
此外,在步骤6中,请确保转储正确的应用程序集 .
在将来,当我编写迁移时,我可以再次执行这些步骤以使所有灯具保持最新状态 .
为什么不能简单地从db创建一个新的 .json 文件 . 当我需要创建一个新夹具时,这就是我所做的 .
.json
python manage.py dumpdata <your_app> auth > test_data.json
迁移数据库时,移动我的灯具的最佳方法是什么?
太晚了 .
在迁移数据库时,需要 loaddata 和 dumpdata .
loaddata
dumpdata
一个人停止工作,为时已晚 .
可能的后备是编写一个简短的脚本来将JSON fixture加载到内存中,然后“手动”构建数据库对象 .
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'] ... )
通过这些内容,您可以使用当前架构和传统夹具构建数据库 .
3 回答
这是我使用的过程:
首先将代码回滚到创建夹具的修订版 . 例如:
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中,请确保转储正确的应用程序集 .
在将来,当我编写迁移时,我可以再次执行这些步骤以使所有灯具保持最新状态 .
为什么不能简单地从db创建一个新的
.json
文件 . 当我需要创建一个新夹具时,这就是我所做的 .太晚了 .
在迁移数据库时,需要
loaddata
和dumpdata
.一个人停止工作,为时已晚 .
可能的后备是编写一个简短的脚本来将JSON fixture加载到内存中,然后“手动”构建数据库对象 .
通过这些内容,您可以使用当前架构和传统夹具构建数据库 .