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

如何在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数据库存在无主键的表。

问题原因

  1. 版本兼容冲突:USER_TAB_COLS视图里的IDENTITY_COLUMN字段是Oracle 12c及以上版本才新增的。如果你的Oracle版本低于12c,Django的inspectdb工具查询这个不存在的字段就会触发ORA-00904错误。
  2. 无主键表限制: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

二、手动编写无主键表的模型

对于无主键的表,手动写模型时要注意这几点:

  1. 设置managed = False,告诉Django不要管理该表的创建和修改
  2. 选一个唯一非空字段标记为primary_key=True;如果没有唯一字段,可任选一个非空字段当主键,同时添加复合唯一约束
  3. 严格按照数据库表结构定义所有字段

示例模型(以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:15:31