Django将模式从sqlite迁移到postgresql

时间:2015-12-08 17:29:51

标签: python django postgresql sqlite python-3.x

我正在开发一个基于django的大型项目。在我的笔记本电脑上,我使用SQLite3作为数据库。我为我的模型创建了很多迁移。一切似乎都有效。

然后我想在生产服务器上使用PostgreSQL。我准备了一个空数据库并尝试manage.py syncdb。由于不存在关系,我突然得到一个错误。

Operations to perform:
  Synchronize unmigrated apps: suit, messages, humanize, imagekit, staticfiles, crispy_forms, storages, django_extensions, localflavor, registration
  Apply all migrations: [here list of my apps], sites, user_auth, sessions, auth
Synchronizing apps without migrations:
  Creating tables...
    Creating table registration_registrationprofile
    Running deferred SQL...
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/db/backends/utils.py", line 62, in execute
    return self.cursor.execute(sql)
psycopg2.ProgrammingError: relation "user_auth_account" does not exist

尝试删除我的sqlite数据库并使用新的sqlite执行syncdb:它会毫无问题地创建架构。

在这里,我意识到SQLite不使用外键关系,只是对所有引用使用integer类型。所以它适用于sqlite。非常聪明,Django。但我所有的模特都是相互依赖的。我想使用不同的数据库。

现在我有一堆只在SQLite上工作的迁移。

我了解可以为首先创建模型的每个应用程序逐个运行迁移。但这将是一个地狱。

是否可以检测依赖关系并以正确的顺序运行这些迁移?

1 个答案:

答案 0 :(得分:1)

Django正确处理迁移模型之间的依赖关系。它能够处理的内容以及明确警告in the docs的内容是未迁移的应用程序,它们依赖于迁移的应用程序:

  

但请注意,未迁移的应用无法依赖迁移   应用程序,本质上没有迁移。这意味着它   通常不可能让未迁移的应用程序具有ForeignKey   或ManyToManyField到迁移的应用程序;有些情况可能有效,但会有效   最终失败了。

     
    

警告

         

即使事情似乎适用于未迁移的应用程序,具体取决于     迁移的应用程序,Django可能无法生成所有必需的外键     约束!

  

在这种特定情况下,似乎registration应用程序依赖于用户模型。您需要将此应用程序升级到具有必要的迁移文件以支持Django 1.7 +的版本。