2010-10-23 94 views
18

我有一个Django应用程序。我有.json夹具文件包含测试数据,单元测试使用数据来确认应用程序正常工作。我也使用南迁移我的数据库。迁移Django装置?

在做了一些数据库迁移之后,我的设备已过期,因为数据库已经迁移,例如添加了一个新的数据库列,并且fixture数据没有该列,因为它是在数据库改变。

迁移我的数据库时移动灯具的最佳方式是什么?

回答

12

这是我使用的过程:

  1. 回退代码,在最初造成灯具的修订。例如:svn up -r12345

  2. 清空数据库,然后用manage.py syncdb --noinput --migrate

  3. 负载与manage.py loaddata my_fixture.json

  4. 滚码前到现在的灯具与manage.py migrate

  5. 创建它,用 svn up

  6. 迁移数据库

  7. 将数据转储到manage.py dumpdata --indent=2 myapp >my_fixture.json

请注意,在选择过去的修订版回滚到时,您需要小心。就我而言,我有一些最新的修复需要到位,所以我实际上必须选择目录才能回滚到特定的修订版本。单调乏味,但比手动编辑一个9000行的JSON文件更好。

此外,在第6步中,请务必转储正确的应用程序集。

在未来,因为我写的迁移,我可以再次做这些措施来保证所有的灯具上的更新。

+1

虽然我刚刚起步,但我正处于类似的情况,希望采取先试后做的方法。整个'清空数据库,加载测试夹具,迁移,转储测试夹具'过程将会终止工作流程。希望其他人会建议(或编码;-))更优雅的解决方案。 – 2010-10-26 08:11:53

+0

请注意,如果您先回滚,则最终会出现当时的灯具。这意味着两者之间的任何变化都将被丢弃。如果有人手动更新,它将被取消,所以我倾向于将灯具复制到其他地方,然后回滚,加载移动的灯具,快进,移植等等。 – MrE 2017-06-09 01:55:45

-2

迁移我的数据库时移动灯具的最佳方式是什么?

太晚了。

在迁移数据库时,您需要loaddatadumpdata

它停止工作,它为时已晚。

可能的后退是编写一个简短的脚本来将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'] 
       ... 
       ) 

沿着这些线条的东西,您可能能够使用您当前的架构和传统装置构建数据库。

+3

谢谢,但我不相信这太迟了。我总是可以将我的代码和/或数据库回滚到之前的状态,所以我确信我可以回到正确的轨道上。你能否提供关于loaddata/dumpdata如何工作的更多细节?例如,我假设中间存在迁移。但是如果我的灯具仅适用于一种应用,南方将如何知道应用迁移? – 2010-10-23 03:38:22

+0

@Ned Batchelder:“我总是可以回滚我的代码和/或我的数据库到以前的状态,”虽然这是真的,但这太复杂了。真的太晚了。有关loaddata和dumpdata,请阅读以下内容:http://docs.djangoproject.com/en/dev/ref/django-admin/。 – 2010-10-23 04:16:33

+3

如果是迁移灯具,这对南方来说也是一个杀手级的功能。 – 2010-10-23 04:44:41

1

为什么你不能简单地从你的数据库中创建一个新的.json文件。当我需要创建一个新的灯具时,这就是我所做的。

python manage.py dumpdata <your_app> auth > test_data.json 
+0

因为我的测试数据是受控样本,而不仅仅是我的生产数据库的最新快照。 – 2010-10-23 12:00:44