Django中inspectdb未生成所有表模型的解决方法咨询
解决Django inspectdb仅生成部分SQL Server表模型的问题
我之前处理带多schema的SQL Server数据库时,也碰到过一模一样的情况——默认的inspectdb只会扫描dbo schema下的表,像HumanResources.Department这类其他schema的表根本不会被生成。下面是具体的解决步骤:
1. 先确认数据库用户权限
首先得确保你连接SQL Server的账号,拥有所有目标schema下的表的读取权限。最简单的方式是给账号添加db_datareader角色,或者直接执行SQL授权:
GRANT SELECT ON SCHEMA::HumanResources TO your_db_user; GRANT SELECT ON SCHEMA::Person TO your_db_user; -- 对AdventureWorks里其他需要生成模型的schema(比如Production、Sales)重复上述授权
2. 针对每个schema单独生成模型
因为inspectdb默认只处理dbo,你需要手动指定其他schema来生成对应模型,并且用追加模式写入models.py:
- 先生成
dboschema的模型(如果已经生成过可以跳过):python manage.py inspectdb > models.py - 接着生成
HumanResourcesschema的模型,追加到models.py:python manage.py inspectdb --schema HumanResources >> models.py - 同理,对AdventureWorks的其他schema重复操作:
python manage.py inspectdb --schema Person >> models.py python manage.py inspectdb --schema Production >> models.py
3. 清理和调整生成的模型
生成完成后,需要做些收尾工作:
- 删除重复的
from django.db import models行(每个schema生成时都会自动添加一次) - 检查模型的
db_table属性,确保格式正确(比如HumanResources.Department会被生成为db_table = 'HumanResources.Department') - 按需修改模型名称:默认生成的模型名可能是
HumanresourcesDepartment,你可以手动改成Department并添加verbose_name - 确认主键设置:如果某些表没有显式主键,
inspectdb会自动生成id = models.AutoField(primary_key=True),需要核对是否符合实际业务逻辑
4. 可选:配置默认schema简化后续操作
如果后续经常要操作多schema的表,可以在settings.py的数据库配置里指定默认schema(注意这个配置只能指定一个默认值,其他schema还是需要用--schema参数):
DATABASES = { 'default': { 'ENGINE': 'sql_server.pyodbc', 'NAME': 'AdventureWorks2017', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'SQL-Server-2017', 'OPTIONS': { 'driver': 'ODBC Driver 17 for SQL Server', 'schema': 'dbo', # 指定默认schema }, } }
这样操作后,就能生成AdventureWorks2017中所有schema下的表模型了。
内容的提问来源于stack exchange,提问作者Amir.S
相关产品推荐
相关产品推荐

