我有一个 Django 应用程序。我有包含测试数据的 .json 夹具文件,单元测试使用数据来确认应用程序是否正常工作。我也使用 South 来迁移我的数据库。
在进行了几次数据库迁移之后,我的设备已经过时了,因为数据库已经迁移,例如添加了一个新的数据库列,而设备数据没有该列,因为它是在数据库更改之前捕获的。
在我迁移数据库时,将我的装置向前移动的最佳方式是什么?
我有一个 Django 应用程序。我有包含测试数据的 .json 夹具文件,单元测试使用数据来确认应用程序是否正常工作。我也使用 South 来迁移我的数据库。
在进行了几次数据库迁移之后,我的设备已经过时了,因为数据库已经迁移,例如添加了一个新的数据库列,而设备数据没有该列,因为它是在数据库更改之前捕获的。
在我迁移数据库时,将我的装置向前移动的最佳方式是什么?
这是我使用的过程:
将代码回滚到最初创建夹具的修订版。例如: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 步中,请务必转储正确的应用程序集。
将来,当我编写迁移时,我可以再次执行这些步骤以使所有固定装置保持最新。
为什么你不能简单地.json
从你的数据库中创建一个新文件。当我需要创建一个新夹具时,这就是我所做的。
python manage.py dumpdata <your_app> auth > test_data.json
在我迁移数据库时,将我的装置向前移动的最佳方式是什么?
太晚了。
迁移数据库时,您需要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']
...
)
有了这些思路,您也许可以使用当前架构和旧设备来构建数据库。