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

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:

  • 先生成dbo schema的模型(如果已经生成过可以跳过):
    python manage.py inspectdb > models.py
    
  • 接着生成HumanResources schema的模型,追加到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:28:18