【发布时间】:2015-10-28 21:51:18
【问题描述】:
长话短说,Django 迁移和用户模型发生了一些我不理解的事情。与客户用户身份验证模型和迁移有关的外键关系有些问题。
我使用 SQLite 和自定义用户对象开发了本地应用程序: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
不幸的是,测试仍然以同样的方式失败 - 即使正常/生产数据库已正确迁移,并且迁移始终如一,测试数据库的内容也会因相同的外键问题而失败。
如果我注意迁移的顺序,我可以让实际的数据库正常工作:
./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 将适用于“真实”数据库 - 但这对失败的测试没有帮助。
【问题讨论】:
标签: mysql django postgresql django-migrations