我需要将一个复杂的项目从sqlite迁移到PostgreSQL。 很多人似乎都有外键,数据截断等问题......
修改:我试过了django-command-extensions DumpScript,但它没有在我身上运行 带有我当前数据集的2GB RAM PC。
答案 0 :(得分:32)
根据我的经验,倾销&从SQL还原无法正常工作。
您应该遵循以下顺序:
<强> 1。将db内容转储到json
$ ./manage.py dumpdata > dump.json
<强> 2。在settings.py
中切换后端DATABASES = {
# COMMENT OUT:
# 'default': dj_database_url.config(default='sqlite:////full/path/to/your/database/file.sqlite'),
# ADD THIS INSTEAD:
'default': dj_database_url.config(default='postgres://localhost:5432/postgres_db_name'),
}
第3。 Syncdb并将新数据库迁移到相同的表结构
$ ./manage.py syncdb
$ ./manage.py migrate
<强> 4。将json加载到新数据库。
$ ./manage.py loaddata dump.json
<强> 5。恭喜!现在,新数据位于你的postgres数据库中。
答案 1 :(得分:9)
我从来没有这样做,但我会尝试的是。
答案 2 :(得分:4)
另一种方法可能是使用多个数据库。
http://docs.djangoproject.com/en/dev/topics/db/multi-db/
阅读本节非常重要。
根据我的理解,这意味着如果你的新数据库中没有数据,例如你可以从灯具中做到
queryset = MyModel.objects.using("old-db").all()
for obj in queryset:
obj.save(using="new-db")
因为这应该保留主键,我认为不存在任何外键问题。
答案 3 :(得分:3)
首先我要尝试一下简单的事情:
sqlite3 sqllitedb .dump | psql postgresdb
此时,只需测试一下。在Django中编写一些测试脚本,为每个应用程序输出一组样本记录,然后进行差异以确保它们完全相同。如果是,那么你的转换可能就好了。
我建议不要使用Django转储和加载数据,因为我猜它没有优化这样做。
相反,我会使用正确的PostgreSQL数据库设置创建第二个版本的应用程序,运行syncdb来创建所有表,然后使用其他工具将数据从mysqllite复制到PostgreSQL。
问题是,转换数据时的大多数问题都在表定义等中。这些似乎是最特殊的。如果您可以生成只是表内容转储的SQL脚本,那么它应该是非常标准的SQL INSERT INTO
命令。
老实说,我不明白为什么会出现外键问题。假设sqlite正在创建准确的外键(为什么不能呢?)那么就没有办法不能正确复制。实际上,外键不是特殊形式的数据。 UserProfile.user_id
字段不太可能包含比UserProfile.photo
字段更不正确的值。如果外键关注的是字段本身没有被正确识别为外键字段(即没有约束),那么首先使用syncdb
创建数据库的选项将解决该问题。
根据截断:据我所知,如果数据即将被截断,PostgreSQL会抛出一个硬错误。我不知道sqlite是否就是这种情况,或者它是否只是静默截断。无论哪种方式,再次假设sqlite不会以某种方式在导出时重置数据,这些字段应该包含它所进入的字段的适当长度的数据。我能想到的唯一可能影响这一点的是字符编码,所以make确保PostgreSQL字段具有与sqlite表相同的编码,至少在导入时是这样。
答案 4 :(得分:2)
根据"syncdb"
使用的@Nimo答案,"syncdb"
无法在 Django 1.9 及以上版本中工作(适用于 Django 1.7) )
请使用以下命令代替:
python manage.py migrate
Postgres设置配置在这里:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
答案 5 :(得分:1)
对我有用的是从红宝石制作续集。 只需运行命令:
gem install sequel
您将需要在系统上安装postgres,sqlite和ruby的devel软件包。 运行命令:
gem install pg sqlite3
在postgresql上创建一个空数据库,假设为testDB并向用户分配授予权限 在命令提示符下运行:
sequel -C sqlite:///path/to/sqlitedb.db postgres://user:password@host/testDB
这将正确运行。
更改django项目中的设置以使用postgres数据库 运行
./manage migrate (not necessary)
运行服务器