如何将Django原生表默认dbo schema改为自定义meta schema?
Django切换默认Schema至meta的解决方案
你的方法为啥没生效?
直接在模型Meta里写db_table = 'meta.auth_group'思路没问题,但makemigrations没反应的原因有两个:
- 用
inspectdb生成的模型默认带managed = False,这个参数告诉Django“别管这个表的创建和修改”,所以你改了db_table它也不认为需要生成迁移。 - 像
auth_group这类Django内置模型,你直接改本地生成的models.py会和框架自带的模型定义冲突,Django优先用自己内置的,你的修改等于白做。
两种可行的解决办法
1. 全局设置默认Schema(最省心)
直接在settings.py的数据库配置里指定默认Schema,所有Django创建的表都会自动用meta,不用逐个改模型:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlserver', # 换成你实际用的数据库引擎 'NAME': '你的数据库名', 'USER': '数据库账号', 'PASSWORD': '密码', 'HOST': '数据库地址', 'PORT': '端口', 'OPTIONS': { 'schema': 'meta', # 把默认Schema设为meta }, } }
改完之后跑makemigrations和migrate,Django就会在meta下操作所有表了。
2. 单个模型指定Schema(适合只改部分表的场景)
如果只是部分表要换Schema,得做这两步:
- 删掉模型里的
managed = False,让Django接管这个表的生命周期 - 针对SQL Server,
db_table要写成[meta].[表名]的格式,不然识别不对:
class AuthGroup(models.Model): name = models.CharField(max_length=150, unique=True) class Meta: db_table = '[meta].[auth_group]' managed = True # 必须开这个,Django才会处理迁移
之后再跑迁移命令就能检测到变化了。
给你之前操作的修正建议
- 先确认数据库里有
metaSchema,没有的话先执行CREATE SCHEMA meta; - 用你之前的TSQL语句把dbo下的表全转到meta里(注意把原语句里的
dbo和meta互换,原语句是把meta的表转去dbo,现在要反过来):
ALTER SCHEMA meta TRANSFER [dbo].[django_admin_log] ALTER SCHEMA meta TRANSFER [dbo].[admin_interface_theme] ALTER SCHEMA meta TRANSFER [dbo].[auth_group] ALTER SCHEMA meta TRANSFER [dbo].[auth_group_permissions] ALTER SCHEMA meta TRANSFER [dbo].[auth_user] ALTER SCHEMA meta TRANSFER [dbo].[auth_user_groups] ALTER SCHEMA meta TRANSFER [dbo].[auth_user_user_permissions] ALTER SCHEMA meta TRANSFER [dbo].[django_content_type] ALTER SCHEMA meta TRANSFER [dbo].[django_migrations] ALTER SCHEMA meta TRANSFER [dbo].[django_session] ALTER SCHEMA meta TRANSFER [dbo].[reversion_revision] ALTER SCHEMA meta TRANSFER [dbo].[reversion_version] ALTER SCHEMA meta TRANSFER [dbo].[auth_permission]
- 最后在
settings.py里加上全局默认Schema的配置,再跑迁移就搞定了
内容的提问来源于stack exchange,提问作者Farrel
相关产品推荐
相关产品推荐

