【问题标题】:Django: Loaddata command after syncdb failsDjango:syncdb失败后的Loaddata命令
【发布时间】:2011-07-16 12:43:18
【问题描述】:

我正在尝试使用固定装置作为一种与数据库无关的方式将数据导入我的数据库,但这比它应该做的要困难得多。我想知道我做错了什么......

具体来说,当我执行 syncdb,然后是 migrate,然后是 loaddata 时我遇到了麻烦,因为 syncdb 已经创建了 loaddata 尝试从转储中读取的数据 .这会导致重复输入,从而导致脚本崩溃。

这似乎与此处描述的问题相同:https://code.djangoproject.com/ticket/15926

但我觉得这似乎是一个被忽视的问题很奇怪。固定装置不是要实际放入真实(实时)数据吗?

如果是这样:是否有任何适用于此的 Django 格式?还是每个人都只是将数据作为 SQL 转储?如果是这样,如何将 SQLite 中的开发数据迁移到生产数据库?

【问题讨论】:

    标签: django


    【解决方案1】:

    如果你有正确命名的灯具并且在正确的位置,syncdb 也会从灯具中加载数据。有关详细信息,请参阅此链接。

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

    如果您不想在每个同步数据库上加载数据,那么您需要更改夹具的名称。

    fixtures 是一种加载数据的好方法,我在许多项目中都使用过它。在某些项目中,当我有大量数据时,我有时会编写一个特殊的加载脚本,该脚本将从我的数据源中获取数据并加载我的新 django 模型,自定义脚本的工作量更大,但给你更多的灵活性。

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

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

    【讨论】:

    • 在您提供的链接中:“请记住,每次运行 syncdb 时都会刷新数据。因此,请勿将 initial_data 用于要编辑的数据。” - 不是我要找的东西我猜......我会尝试别的东西
    【解决方案2】:

    在这里;到目前为止,这是我想出的:

    # 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。我不确定我是否喜欢它,我很惊讶它是必要的,但它确实有效。

    【讨论】:

    • 你能重命名夹具文件吗?如果是这样,为什么不将它们重命名为 syncdb 不会获取的名称,然后当您调用 loaddata 时,数据将不会已经在数据库中。
    • 技术上我可以重命名它们;但是由于一切都在脚本中运行(并且错误会删除所有数据),这对我来说有点脆弱
    猜你喜欢
    • 2017-03-04
    • 2018-11-28
    • 2011-11-04
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    相关资源
    最近更新 更多