【问题标题】:Why am I getting an IntegrityError when attempting to import JSON?为什么在尝试导入 JSON 时出现 IntegrityError?
【发布时间】:2013-11-10 15:13:58
【问题描述】:

我正在尝试从 MySQL 数据库中导出一些数据并将其导入 PostgreSQL 数据库。这两种模型描述如下:

class Location(models.Model):
    name = models.CharField(max_length=100)

class Item(models.Model):
    title    = models.CharField(max_length=200)
    location = models.ForeignKey(Location)

class Book(Item):
    author = models.CharField(max_length=100)

请注意,Book 模型继承自 Item 模型。 (另外,我确实意识到 author 确实应该是一个单独的模型 - 但我需要一些简单的东西来演示这个问题。)我首先尝试使用 dumpdata 命令从模型中导出数据:

./manage.py 转储数据 myapp.location >locations.json ./manage.py 转储数据 myapp.item >items.json ./manage.py 转储数据 myapp.book >books.json

items.json 中的 JSON 如下所示:

{
    "fields": {
        "title": "Introduction to Programming",
        "location": 1
    },
    "model": "myapp.item",
    "pk": 1
}

books.json 中的 JSON 如下所示:

{
    "fields": {
        "author": "Smith, Bob"
    },
    "model": "myapp.book",
    "pk": 1
}

我可以毫无问题地导入locations.jsonitems.json,但是一旦我尝试导入books.json,就会遇到以下错误:

IntegrityError:安装夹具“books.json”时出现问题:无法加载 myapp.Book(pk=1):“location_id”列中的空值违反非空值 约束

编辑:myapp.books 的架构(根据 PostgreSQL 本身)如下:

# 选择 * FROM myapp_book; item_ptr_id |作者 -------------+-------- (0 行)

【问题讨论】:

  • 我不知道为什么这被否决了?

标签: python django json export


【解决方案1】:

books.json 文件需要包含父模型的所有字段,在您的情况下,需要添加“title”和“location”字段(当然还有适当的值)(来自 items.json 文件)。 loaddata 不使用数据库结构(中间有表和所有),但会检查模型的实际字段。

为避免出现重复条目​​,您还必须删除 myapp_book 表中原始 mysql 数据库指向的 items.json 文件中的所有 json 条目。

另一种解决方案是使用http://pypi.python.org/pypi/py-mysql2pgsql(另请参阅this question)

【讨论】:

    【解决方案2】:

    似乎无论出于何种原因,您的 postgres 数据库中的 Books 架构与模型不匹配 - 它有一个 location_id 列。您应该删除表并重新运行 syncdb。

    【讨论】:

    • 我已经根据 PostgreSQL 使用当前模式更新了我的问题。此外,Django 抱怨的领域不在Book 模型中,而是在Item 模型中。
    猜你喜欢
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2021-05-01
    • 2020-08-14
    • 2020-03-21
    • 2022-10-22
    • 1970-01-01
    相关资源
    最近更新 更多