Django+django-tenant-schemas:新租户Schema跳过迁移提速方案问询
我之前在维护一个用django-tenant-schemas搭建的多租户项目时,正好碰到过这个迁移耗时过长的问题——每次新建租户要等10多分钟,完全没法接受!后来摸索出了一个靠克隆基准Schema跳过全量迁移的方案,亲测有效,分享给你:
核心思路
直接基于一个已经完成所有迁移的基准租户Schema来克隆新租户,这样创建过程瞬间就能完成,彻底跳过漫长的migrate流程。
具体实现步骤
1. 初始化基准租户模板
- 先手动创建一个专门的基准租户(比如命名为
base_template),执行完整的迁移命令让它的Schema处于最新状态:python manage.py migrate_schemas --schema base_template - 这个租户只作为模板使用,不需要对外提供服务,可以在代码里限制它的访问,或者直接在数据库层面禁用登录权限。
2. 修改租户创建逻辑,替换自动迁移为Schema克隆
默认情况下,调用Tenant.save()会自动触发migrate流程,我们需要跳过这个步骤,改用Postgres的原生命令克隆Schema:
from django.db import connection from django_tenants.models import Tenant, Domain def create_tenant_fast(domain_name, schema_name): # 创建租户对象,但跳过自动创建Schema和迁移的步骤 tenant = Tenant(schema_name=schema_name) tenant.save(create_schema=False) # 关键参数:create_schema=False # 创建关联的域名 domain = Domain() domain.domain = domain_name domain.tenant = tenant domain.is_primary = True domain.save() # 用Postgres命令克隆基准Schema到新租户 with connection.cursor() as cursor: # 克隆Schema结构和数据(如果不需要基准数据可以去掉DATA关键字) cursor.execute(f""" CREATE SCHEMA "{schema_name}" WITH DATA FROM SCHEMA "base_template"; """) # 给数据库用户授予新Schema的权限 cursor.execute(f""" GRANT ALL PRIVILEGES ON SCHEMA "{schema_name}" TO your_database_user; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA "{schema_name}" TO your_database_user; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA "{schema_name}" TO your_database_user; """)
3. 处理后续的迁移更新
当项目有新的迁移文件需要应用时:
- 先把新迁移应用到基准租户模板:
python manage.py migrate_schemas --schema base_template - 然后对所有已存在的租户执行增量迁移(因为只有新的迁移要跑,耗时会非常短):
from django_tenants.models import Tenant from django.core.management import call_command # 排除公共Schema和基准模板 tenants = Tenant.objects.exclude(schema_name__in=['public', 'base_template']) for tenant in tenants: call_command('migrate_schemas', schema_name=tenant.schema_name, verbosity=1)
4. 注意事项
- 每次新增迁移后,一定要先更新基准租户模板,确保后续克隆的新租户都是最新状态。
- 如果你的租户需要默认初始化数据(比如系统配置、角色权限等),可以把这些数据提前写入基准租户,克隆后新租户会自动继承,省去单独写初始化脚本的麻烦。
- 上线前一定要在测试环境验证:克隆租户后检查所有表结构、权限、默认数据是否和基准租户一致,避免出现遗漏。
内容的提问来源于stack exchange,提问作者Davy
相关产品推荐
相关产品推荐

