长话短说,Django迁移和我不理解的用户模型正在发生一些事情。关于与客户用户身份验证模型和迁移的外键关系的事情是不可能的。
我使用SQLite和自定义用户对象开发了应用程序localy:class Client(AbstractBaseUser, PermissionsMixin)
在我的settings.py中,我有:
AUTH_USER_MODEL = "offerdrive.Client"
所有内容都适用于SQLite和本地/开发,此时应用程序具有合理的功能集。
当时间进入生产时,我尝试了Postgres,但它失败了。然后我在RDS上尝试了MySQL,它以同样的方式失败了。
这是./manage.py migrate
之后的MySql错误:
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
这是好奇的一些InnoDB调试信息(来自mysql> show engine innodb status\G
) -
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2015-08-05 22:01:36 2af53b3cf700 Error in foreign key constraint of table test_drivedb/#sql-a69_248:
FOREIGN KEY (`user_id`) REFERENCES `offerdrive_client` (`id`):
Cannot resolve table name close to:
(`id`)
我将所有迁移“扁平化”为“老式”方式 - rm -rf'ed
migrations
目录,并重新makemigrations
。
我读过并试过的一些内容未能完全解决问题:
[1] Django 1.8 RC1: ProgrammingError when creating database tables。
[2] https://code.djangoproject.com/ticket/24524
不幸的是,测试仍然以同样的方式失败 - 即使正常/ prod数据库正确迁移,并且迁移工作一致,测试数据库的内容也会因同一个外键问题而失败。如果我对迁移的顺序非常小心,我可以让实际的数据库工作正常:
./manage.py reset_db
./manage.py migrate auth
./manage.py offerdrive
./manage migrate
但是,这似乎不适用于测试 - 似乎不会以任何方式运行./manage.py test offerdrive
强制执行订单。它以同样的方式失败 - 抱怨同样的外键关系。
对于像Django这样的框架来说,这似乎是一个绝对愚蠢的问题,而我在想我正在做一些真正愚蠢的事情。应用程序本身不做任何奇怪或疯狂的事情。对我来说,为什么它适用于SQLite而不是Postgres或MySQL仍然令人困惑。我最好的猜测是SQLite对外键约束不太严格,并且即使表是按顺序创建的,它们最终也会自行解决。那,或其他。可能。
tl; dr计算机很难
有什么想法吗?
更新 - 显然连续两次运行migrate
将适用于“真正的”数据库 - 但这对于失败的测试没有帮助。
答案 0 :(得分:2)
pip install --upgrade django-registration-redux
。
1)转折点是(并且我无法相信我没有及早想到这一点)在./manage.py migrate -v3
上实现额外的详细程度并看到它确实失败的地方(之前,我试过了)通过实际的django迁移加载/执行代码丢弃调试器,结果看起来是一个错误的抽象级别()
2)看一下详细的迁移输出,显然有些东西在registration_profile
表周围发生了轰炸。 (这是迁移失败前最后一次运行的事情。)
3)我在应用程序(django-registration / django-registration-redux)周围挖了一个应用程序对应... aaaand,看起来没有迁移。这是一个问题,因为根据"" https://docs.djangoproject.com/en/1.8/topics/migrations/#dependencies
Be aware, however, that unmigrated apps cannot depend on migrated apps, by the very nature of not having migrations.
4)随心所欲,在尝试将自己的迁移添加到模块之前,我使用django-registration-redux
升级了django-registration
和pip install --upgrade
Aaaand修好了它。万岁#engineering!
我想要注意的是,这与自定义用户模块无关,只是一种过时的依赖关系,我甚至都不知道是在输入图片。
答案 1 :(得分:0)
尝试各种方法解决问题后,我终于从系统中完全删除了mysql(如果您有重要的数据库,请先进行备份)并重新安装。
然后我重复了通常的步骤:-
$./manage.py makemigrations
$./manage.py migrate
成功了。请记住,先迁移“身份验证”,然后再迁移其他应用。