如何在Django中探查无主键Oracle数据库?运行inspectdb遇ORA-00904错误
解决Django inspectdb探查Oracle数据库时的ORA-00904错误及无主键表处理问题
问题场景
执行Django数据库探查命令:
python .\manage.py inspectdb --database=ORACLE > models.py
命令整体运行成功,但生成的models.py中出现多个表无法探查的错误:
# Unable to inspect table 'acc_advance_other_adj_dt' # The error was: ORA-00904: "USER_TAB_COLS"."IDENTITY_COLUMN": invalid identifier # Unable to inspect table 'acc_ari_entries_dt' # The error was: ORA-00904: "USER_TAB_COLS"."IDENTITY_COLUMN": invalid identifier # Unable to inspect table 'acc_asset_mt' # The error was: ORA-00904: "USER_TAB_COLS"."IDENTITY_COLUMN": invalid identifier
同时目标Oracle数据库存在无主键的表。
问题原因
- 版本兼容冲突:
USER_TAB_COLS视图里的IDENTITY_COLUMN字段是Oracle 12c及以上版本才新增的。如果你的Oracle版本低于12c,Django的inspectdb工具查询这个不存在的字段就会触发ORA-00904错误。 - 无主键表限制:Django模型要求每个模型必须有主键,无主键的表无法被
inspectdb自动生成合法模型,也会加重探查失败的问题。
解决方案
一、修复ORA-00904错误
方法1:升级Oracle数据库(长期方案)
如果业务允许,把Oracle数据库升级到12c或更高版本,就能兼容Django对IDENTITY_COLUMN字段的查询。
方法2:修改Django Oracle后端代码(临时方案)
无法升级数据库的话,直接修改Django的Oracle探查逻辑:
- 找到Django安装目录下的
django/db/backends/oracle/inspect.py文件 - 定位到查询
USER_TAB_COLS的SQL语句,删掉所有对IDENTITY_COLUMN字段的引用(包括SELECT列表、WHERE/ORDER BY里的条件) - 保存文件后重新执行
inspectdb命令
方法3:跳过报错表,手动编写模型
执行命令时用--exclude参数跳过报错的表,先生成其他表的模型,再手动补写报错表的模型:
python .\manage.py inspectdb --database=ORACLE --exclude acc_advance_other_adj_dt acc_ari_entries_dt acc_asset_mt > models.py
二、手动编写无主键表的模型
对于无主键的表,手动写模型时要注意这几点:
- 设置
managed = False,告诉Django不要管理该表的创建和修改 - 选一个唯一非空字段标记为
primary_key=True;如果没有唯一字段,可任选一个非空字段当主键,同时添加复合唯一约束 - 严格按照数据库表结构定义所有字段
示例模型(以acc_advance_other_adj_dt为例):
from django.db import models class AccAdvanceOtherAdjDt(models.Model): # 假设col1是表中唯一非空字段,标记为主键 col1 = models.CharField(max_length=50, primary_key=True) col2 = models.DecimalField(max_digits=12, decimal_places=2, null=True) col3 = models.DateField(null=True) # 其他字段根据实际表结构补充 class Meta: managed = False db_table = 'acc_advance_other_adj_dt' # 需要复合唯一约束的话,添加以下配置 constraints = [ models.UniqueConstraint(fields=['col1', 'col2'], name='acc_advance_other_adj_dt_unique') ]
内容的提问来源于stack exchange,提问作者Abhay Pratap Rana
相关产品推荐
相关产品推荐

