2011-07-16 70 views
0

我试图使用灯具作为数据库不可知的方式来获取数据到我的数据库,但这是比它应该更难。我不知道我做错了什么......Django:SyncDB失败后Loaddata命令

具体来说,当我做了执行syncdb随后在迁移之后是loaddata我遇到了麻烦,因为执行syncdb已经创建数据loaddata试图读取从转储。这会导致重复输入,从而导致脚本崩溃。

这似乎这里描述的是同样的问题:https://code.djangoproject.com/ticket/15926

但它的怪异,我认为这似乎是一个被忽略的问题。夹具是不是真的把真实(活的)数据放进去?

如果是这样:是否有任何Django格式是为了这个?或者每个人都只是将数据转储为SQL?而且,如果是这样,那么如何将SQLite中的开发数据迁移到生产数据库?

回答

0

OP在这里;这就是我想出迄今:

# some_app/management/commands/delete_all_objects.py 

from django.core.management.base import BaseCommand, CommandError 
from django.db.models import get_models 

class Command(BaseCommand): 
    help = 'Deletes all objects' 

    def handle(self, *args, **options): 
     for model in get_models(): 
      model.objects.all().delete() 

然后就是syncdb & migrate后之间loaddata之前运行delete_all_objects。我不确定我是否喜欢它,我很惊讶它是必要的,但它是有效的。

+0

你可以重命名夹具文件吗?如果是这样,为什么不将它们重命名为syncdb不会提取的内容,然后当您调用loaddata时,数据已经不在数据库中。 –

+0

我在技术上可以重命名它们;但由于一切都在脚本中运行(并且错误会清除所有数据),这对我的口味来说有点脆弱 –

1

如果您有正确命名并位于正确位置的夹具,syncdb也将从夹具载入数据。查看此链接了解更多信息。

https://docs.djangoproject.com/en/1.3/howto/initial-data/#automatically-loading-initial-data-fixtures

如果你不希望数据上的每个执行syncdb加载,那么你将需要改变灯具的名称。

灯具是一种可以加载数据的好方法,我已将它用于多个项目。在有些项目中,当我有大量数据时,我有时会编写一个特殊的加载脚本,它将从我的数据源获取数据并加载我的新django模型,自定义脚本稍微有点多,但是可以提供更多的灵活性。

我倾向于远离使用sql来加载,如果我可以,因为SQL通常是数据库特定的,如果你不得不担心加载不同的数据库版本,如果可以的话远离。

“一般来说,使用夹具是一种更清洁的方法,因为它与数据库无关,但初始SQL也相当灵活。”

+0

在您提供的链接中:“请记住,每次运行syncdb时都会刷新数据,因此不要使用initial_data作为要编辑的数据。” - 不是我正在寻找的东西我猜...我会尝试其他东西 –