You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 处理后续的迁移更新

当项目有新的迁移文件需要应用时:

  1. 先把新迁移应用到基准租户模板:
    python manage.py migrate_schemas --schema base_template
    
  2. 然后对所有已存在的租户执行增量迁移(因为只有新的迁移要跑,耗时会非常短):
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:51:05