Django - 无法让加载数据工作

Posted

技术标签:

【中文标题】Django - 无法让加载数据工作【英文标题】:Django - cannot get loaddata to work 【发布时间】:2014-04-11 15:41:12 【问题描述】:

我使用 Django 数据库已经有一段时间了,没有出现任何重大问题。今天我第一次需要为几个表设置默认值。我在*** Django 目录中创建了一个 fixtures 目录。然后我为默认值创建了文件。但是,我不断收到错误消息,我不知道为什么。

首先我尝试使用 .sql 文件。值得注意的是,这些表格非常简单;它们只有一个值,“名称”。我的 SQL 文件如下所示:

INSERT INTO MyTable (name) VALUES ('Default');

我将其保存为MyTable.sql。当我运行命令python manage.py loaddata fixtures/MyTable.sql 时,我收到以下错误消息:

CommandError: Problem installing fixture 'MyTable': sql is not a known serialization format.

(注意:对于上面的示例和下一个示例,我也尝试不使用 fixtures/ 部分,并得到相同的结果。

我询问了我的项目负责人,他说他认为 SQL 文件不能用于此目的。所以,我尝试了 JSON 文件。我的MyTable.json 看起来像这样: [ "model": "mydatabase.MyTable", "pk": 1, "fields": "name": "Default" ]

我会非常坦率地承认我以前从未在这种情况下使用过 JSON,只在 Web 开发中使用过,所以我不知道这个问题是否可能是我在这里做错了。我试图以我找到的格式为基础here。当我再次通过 loaddata 函数运行它时,我收到了以下错误消息:

C:\Python27\lib\site-packages\django-1.6.1-py2.7.egg\django\core\management\commands\loaddata.py:216: UserWarning: No fixture named 'fixtures/MyTable' found.

这是我第一次这样做,我很难找到文档来弄清楚我做错了什么。有人可以提供建议吗?谢谢!

【问题讨论】:

【参考方案1】:

对我来说,问题是输出文件的后缀。

python manage.py dumpdata -o my_dump
python manage.py loaddata < my_dump # it fails
# change the file name my_dump to my_dump.json
python manage.py loaddata < my_dump.json  # it works


所以,我猜dumpdata 隐式使用json 作为输出格式。而loaddata 需要来自文件名后缀的格式提示。

【讨论】:

【参考方案2】:

要创建您的夹具文件,请从一个空数据库开始,然后使用 djanog-admin 或 django shell 甚至纯 SQL 将一些数据添加到您的数据库中。之后你可以做一个

python manage.py dumpdata # 转储所有数据,或者 python manage.py dumpdata app_name # 转储特定应用程序的所有数据,或 python manage.py dumpdata app_name.model_name # 转储特定模型的所有数据

以上内容会将数据打印到您的标准输出。为了将其写入文件,请使用重定向 (>),例如

python manage.py dumpdata auth.User > user_fixture.json

更新:我刚刚看到您使用的是 Windows ——记得使用反斜杠 (\) 加载您的固定装置。

【讨论】:

删除并重新创建数据库以使其为空后,是否需要运行 syncdb 或任何迁移来重新创建 sql 文件引用的表? 您不需要删除重新创建数据库。现在就做一个转储数据(如果它当然包含数据)。 我刚刚运行了上述所有三个命令,每次都返回[],但是当我再次尝试加载数据时,它给出了同样的错误:( 先尝试将一些数据添加到您的数据库中(并执行同步数据库和迁移),然后尝试运行python manage.py dumpdata 以检查是否输出了某些内容。 当我通过我们正在处理这些数据库的程序手动添加一个值并运行它时,它会显示出来【参考方案3】:

我们可以这样做

models.py

from django import models

class Model_Name(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

修复

[
  
    "model": "app_name.model_name",
    "pk": 1,
    "fields": 
        "name": "My app name"
    
  
]

命令

./manage.py loaddata app_name/fixtures/model_name.json

输出:从 1 个装置安装了 1 个对象

【讨论】:

【参考方案4】:

对于那些仍然有这个问题的人。

错误告诉你:

CommandError:安装夹具“MyTable”时出现问题:sql 不是已知的序列化格式。

你可以这样看:

sql 不是已知的序列化格式。

它不会接受任何不以.json结尾的文件。

所以要解决您的问题,请使用以下命令:

$ python manage.py loaddata <your_dump_filename>.json

【讨论】:

以上是关于Django - 无法让加载数据工作的主要内容,如果未能解决你的问题,请参考以下文章

For 循环在 Django、HTML 中无法按预期工作

django:无法让 sorl-thumbnail 工作

我无法让我的 Django URL 工作

django test RequestFactory 无法让路由参数工作

无法让 Apache 为 django 管理静态文件提供服务

Django 1.6.5 - 无法从夹具加载初始数据