我正在开发一个基于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上工作的迁移。
我了解可以为首先创建模型的每个应用程序逐个运行迁移。但这将是一个地狱。
是否可以检测依赖关系并以正确的顺序运行这些迁移?
答案 0 :(得分:1)
Django正确处理迁移模型之间的依赖关系。它能够处理的内容以及明确警告in the docs的内容是未迁移的应用程序,它们依赖于迁移的应用程序:
但请注意,未迁移的应用无法依赖迁移 应用程序,本质上没有迁移。这意味着它 通常不可能让未迁移的应用程序具有ForeignKey 或ManyToManyField到迁移的应用程序;有些情况可能有效,但会有效 最终失败了。
警告强>
即使事情似乎适用于未迁移的应用程序,具体取决于 迁移的应用程序,Django可能无法生成所有必需的外键 约束!
在这种特定情况下,似乎registration
应用程序依赖于用户模型。您需要将此应用程序升级到具有必要的迁移文件以支持Django 1.7 +的版本。