Django:将项目从sqlite迁移到PostgreSQL的最佳实践是什么?

时间:2010-08-13 12:06:27

标签: django sqlite postgresql data-migration

我需要将一个复杂的项目从sqlite迁移到PostgreSQL。 很多人似乎都有外键,数据截断等问题......

  • 是否有完整的自动化工具?
  • 我是否需要在迁移之前检查一些数据或架构?

修改:我试过了django-command-extensions DumpScript,但它没有在我身上运行 带有我当前数据集的2GB RAM PC。

6 个答案:

答案 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)

我从来没有这样做,但我会尝试的是。

  1. 停止运行服务器
  2. python manage.py dumpdata
  3. 更改settings.py以指向新创建的postgres数据库
  4. python manage.py loaddata

答案 2 :(得分:4)

另一种方法可能是使用多个数据库。

http://docs.djangoproject.com/en/dev/topics/db/multi-db/

阅读本节非常重要。

http://docs.djangoproject.com/en/dev/topics/db/multi-db/#moving-an-object-from-one-database-to-another

根据我的理解,这意味着如果你的新数据库中没有数据,例如你可以从灯具中做到

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)

运行服务器