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

Pie*_*ert 26 sqlite django postgresql data-migration

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

  • 有完全自动化的实用程序吗?
  • 我需要在迁移之前检查一些数据或模式吗?

编辑:我尝试了django-command-extensions DumpScript,但它不能在我的2GB RAM PC上使用我当前的DataSet运行.

Nim*_*imo 35

根据我的经验,从SQL转储和还原不能正常工作.

您应该遵循以下顺序:

1.将db内容转储到json

$ ./manage.py dumpdata > dump.json
Run Code Online (Sandbox Code Playgroud)

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'),
}
Run Code Online (Sandbox Code Playgroud)

3. Syncdb并将新数据库迁移到同一个表结构

$ ./manage.py syncdb
$ ./manage.py migrate
Run Code Online (Sandbox Code Playgroud)

4.将json加载到新数据库.

$ ./manage.py loaddata dump.json
Run Code Online (Sandbox Code Playgroud)

祝贺你!现在新数据在你的postgres数据库中.

  • 这会导致错误:django.db.utils.IntegrityError:安装fixture'dump.json'时出现问题:无法加载contenttypes.ContentType(pk = 3):重复键值违反唯一约束"django_content_type_app_label_76bd3d3b_uniq"DETAIL:Key(app_label,model )=(auth,group)已经存在. (8认同)
  • 关于我在上次评论中的错误,似乎你*需要*申请'TRUNCATE django_content_type CASCADE;'*之前*使用loaddata.@Nimo你可以更新你的答案吗? (3认同)
  • @matandked`dumpdata --natural-primary --natural-foreign`将避免您遇到此问题,将其添加到答案中 (3认同)

Mic*_*ann 17

以下是Nimo的回答Stephen对Django 1.7+ 的回答的改进:

  1. ./manage.py dumpdata --natural-primary --natural-foreign > dump.json
  2. 更改DATABASESsettings.py指向新(PostgreSQL的)分贝.
  3. ./manage.py migrate
  4. ./manage.py loaddata dump.json

我遇到的一个问题是SQLite似乎没有实际强制执行CharFields 的最大长度.在我的情况下,这使loaddata步骤失败.我能够通过以下方式找到(并删除)具有太长CharField值的模型实例:

MyModel.objects.extra(where=["LENGTH(text) > 20"]).delete()
Run Code Online (Sandbox Code Playgroud)

一旦我在上面的第1步之前做了这个,一切都运转了.


Ste*_*ger 9

我从来没有做过,但我会尝试的是.

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


Ben*_*ari 6

根据@Nimo 的回答,使用 from"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': '',
    }
}
Run Code Online (Sandbox Code Playgroud)