尝试导入JSON时为什么会出现IntegrityError?

时间:2013-10-30 19:50:50

标签: python django json export

我正在尝试从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命令从模型中导出数据:< / p>

./manage.py dumpdata myapp.location >locations.json
./manage.py dumpdata myapp.item >items.json
./manage.py dumpdata 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: Problem installing fixture 'books.json': Could not load
  myapp.Book(pk=1): null value in column "location_id" violates not-null
  constraint

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

# SELECT * FROM myapp_book;
 item_ptr_id | author
-------------+--------
(0 rows)

2 个答案:

答案 0 :(得分:1)

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

为了避免以双重条目结束,您还必须删除items.json文件中myapp_book表中原始mysql数据库所指向的所有json条目。

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

答案 1 :(得分:0)

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