1

我正在尝试从 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

中的 JSONitems.json如下所示:

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

中的 JSONbooks.json如下所示:

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

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

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

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

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

2 回答 2

1

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

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

另一种解决方案是使用http://pypi.python.org/pypi/py-mysql2pgsql(另见这个问题)

于 2013-10-30T21:55:37.737 回答
0

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

于 2013-10-30T19:58:40.213 回答