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

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 = False
        db_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.kler.cn/a/524265.html

相关文章:

  • android 音视频系列引导
  • AI编译器之——为什么大模型需要Relax?
  • C++/stack_queue
  • 【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南
  • RPC是什么?和HTTP区别?
  • 【教学类-89-01】20250127新年篇01—— 蛇年红包(WORD模版)
  • 全程Kali linux---CTFshow misc入门(1-12)
  • CMake常用命令指南(CMakeList.txt)
  • Vue 3 30天精进之旅:Day 07 - Vue Router
  • 【Python百日进阶-Web开发-FastAPI】Day812 - FastAPI Cookie 参数、Header 参数
  • 运用python爬虫爬取汽车网站图片并下载,几个汽车网站的示例参考
  • 一个python项目中的文件和目录的作用是什么?scripts,venv,predict的具体含义
  • GO 高级特性篇
  • 常见端口的攻击思路
  • 爱书爱考平台说明
  • C#操作GIF图片(上)
  • python+playwright自动化测试(八):iframe切换、多窗口切换
  • Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别
  • 单片机基础模块学习——AT24C02芯片
  • open-webui本地AI人工智能问答知识库搭建
  • 云计算与虚拟化技术讲解视频分享
  • 【赵渝强老师】K8s中Pod探针的ExecAction
  • Java基础知识总结(二十四)--Collections
  • 想品客老师的第五天:Map与WeakMap类型
  • 文本左右对齐
  • Linux shell脚本笔记-One