当前位置: 首页 > news >正文

Django ORM解决Oracle表多主键的问题

现状

以Django 3.2为例

Django ORM 设计为默认使用单一主键(通常是自增的 id 字段),这一选择主要基于以下核心原因:

  • 简化ORM设计与操作
    • 统一访问方式
    • 外键关联简化
  • 避免歧义冲突
    • 主键语义明确
    • 防止隐式依赖
  • 性能与数据库兼容
    • 索引效率优化
    • 跨数据库兼容
  • 替代方案成熟
    • unique_together约束

Oracle现状

原始业务表,很多都使用多主键。

使用Django映射现有Oracle数据库无法处理多主键问题。

Oracle表结构 & Django Model

示例(库存表,使用多主键):

字段主键
item_noTrue
warehouseTrue
locationTrue
quantityFalse

此时,使用Django Inspectdb将该表结构映射到Models文件中,只有item_no字段被设置为primary key,然后使用unique_together的方式来做组合值唯一性控制。这样是存在问题的。

class InventoryDetail(models.Model):item_no= models.CharField(primary_key=True, max_length=15)warehouse = models.CharField(max_length=6)location = models.CharField(max_length=6)quantity = models.DecimalField(max_digits=18, decimal_places=6, blank=True, null=True)class Meta:managed = Falsedb_table = 'inventory_detail'unique_together = (('item_no', 'warehouse', 'location'),)

解决方案

  1. 使用Oracle不可见字段 INVISIBLE,Oracle12以及以上 
    1. 为表创建不可见字段id,字段名自定义:
      alter table inventory_detail add (id int invisible  generated as identity)
    2. 不可见字段默认不会出现在select * 结果中,因此不影响现有系统对该表的使用。
    3. 使用了generated as identity,会自动对原始数据的id字段赋值,新插入的数据也会自动赋值。且无法Update该字段的值
  2. Django数据库映射
    1. 使用inspectdb将表结构映射到models文件时,不可见字段无法写入到文件。
    2. 因此需要手动将该字段添加到model中
      1. id = models.BigAutoField(primary_key=True)
      2. unique_together正常情况下会字段写入,可以不用处理
  3. 然后就可以用了

技术细节

Oracle invisible(不可见字段)

Django ORM

小结

目前基本的测试没问题

http://www.lryc.cn/news/528290.html

相关文章:

  • 机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)
  • ubuntu解决普通用户无法进入root
  • Time Constant | RC、RL 和 RLC 电路中的时间常数
  • 数据结构测试题2
  • 在虚拟机里运行frida-server以实现对虚拟机目标软件的监测和修改参数(一)(android Google Api 35高版本版)
  • mysql_store_result的概念和使用案例
  • Linux进程调度与等待:背后的机制与实现
  • 网易云音乐歌名可视化:词云生成与GitHub-Pages部署实践
  • 单片机基础模块学习——DS18B20温度传感器芯片
  • 《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(下)
  • 书生大模型实战营3
  • Spring Boot 集成 WebClient 实战教程 实现同步、异步请求处理以及响应式编程、响应式流、响应式Mono
  • C语言深入解析 printf的底层源码实现
  • go 循环处理无限极数据
  • C# Dynamic关键字
  • ReactNative react-devtools 夜神模拟器连调
  • 【教学类-89-02】20250128新年篇02——姓名藏头对联(星火讯飞+Python,五言对联,有横批)
  • 装机爱好者的纯净工具箱
  • 【新春不断更】数据结构与算法之美:二叉树
  • 网站结构优化:加速搜索引擎收录的关键
  • Effective Objective-C 2.0 读书笔记—— objc_msgSend
  • [MySQL]事务的隔离级别原理与底层实现
  • 项目升级Sass版本或升级Element Plus版本遇到的问题
  • C++中,存储两个相同类型的数据,数据结构
  • python实战(十五)——中文手写体数字图像CNN分类
  • [论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)
  • Linux - 进程间通信(2)
  • Kafka 消费端反复 Rebalance: `Attempt to heartbeat failed since group is rebalancing`
  • SpringBoot+Electron教务管理系统 附带详细运行指导视频
  • 操作系统(Linux Kernel 0.11Linux Kernel 0.12)解读整理——内核初始化(main init)之控制台工作