升级social-auth-app-django至5.4.1后执行数据库迁移时遇NotImplementedError及模型不存在错误
看起来你在把social-auth-app-django从5.0.0升级到5.4.1后,跑数据库迁移时碰到了LoyaltyTenant找不到的问题——结合你用到的django-tenant-schemas多租户库,这个坑我之前在多租户项目里也踩过,给你几个实用的排查和解决思路:
问题根源分析
这个错误出现在social_django.0011_alter_id_fields迁移执行时,本质是多租户环境下,默认的Django迁移是在public schema里执行的,但你的LoyaltyTenant相关的数据(或者关联的用户模型)可能存在于各个租户的独立schema中,迁移代码里的get_or_create操作没有切换到正确的租户上下文,所以找不到对应模型。
具体解决方法
1. 临时应急:修改第三方迁移文件(不推荐长期用)
找到你的虚拟环境里social_django的0011_alter_id_fields.py迁移文件,给迁移逻辑加上租户上下文包裹:
# 在迁移文件的migrate函数里添加 from django_tenants.utils import schema_context def migrate(apps, schema_editor): # 先获取一个已存在的租户实例(确保你的数据库里至少有一个租户) Tenant = apps.get_model('core', 'LoyaltyTenant') tenant = Tenant.objects.first() # 切换到租户schema上下文再执行原迁移逻辑 with schema_context(tenant.schema_name): # 这里保留原迁移文件里的代码,比如修改id字段的操作 ...
⚠️ 注意:修改第三方库文件只是临时方案,下次升级依赖会被覆盖,建议用下面的方法。
2. 正确姿势:针对每个租户单独执行迁移
用django-tenant-schemas提供的tenant_command命令,逐个为租户执行social_django的迁移:
# 先查看所有租户的schema名称 python manage.py list_tenants # 针对每个租户执行迁移 python manage.py tenant_command migrate --schema=你的租户schema名称
如果租户数量多,可以写个简单的脚本批量执行,比如遍历所有租户,依次调用tenant_command。
3. 长期优化:适配多租户的迁移基类
如果你的项目有自定义的多租户迁移基类,确保social_django的迁移也继承这个基类。或者在项目里创建一个空的迁移文件,在执行social_django的迁移前自动切换到租户上下文,避免后续版本升级再出类似问题。
额外注意事项
- 执行迁移前务必备份数据库,避免数据损坏;
- 先在测试环境验证方案,确认没问题再到生产环境操作;
- 可以查一下social-auth-app-django 5.0.0到5.4.1的版本变更日志,看看是不是迁移逻辑里新增了依赖租户模型的操作,针对性调整。
备注:内容来源于stack exchange,提问作者user2580

