Django如何获取持续更新的底层Oracle表最新数据并实现行操作
核心认知修正
首先你的原有理解是错误的:Django的migration机制仅用于同步数据表结构,和表内存储的业务数据完全无关。只要目标Oracle表的结构没有发生变更,哪怕表内数据每秒动态更新,使用Django ORM查询时获取的都是查询瞬间的数据库最新状态,完全可以满足看板展示实时数据的需求。
技术方案选型
要不要创建Model?
绝大多数场景下都推荐创建Model,仅需要在Model的Meta配置中声明managed = False,指定实际映射的Oracle表名即可,不需要执行对应的migrate操作,也不会影响外部系统对表的修改。
示例配置如下:
from django.db import models class TargetOracleTable(models.Model): # 字段定义需和Oracle表的实际字段名、字段类型完全匹配 id = models.NumberField(primary_key=True) # Oracle数值型主键对应Django的NumberField data_col = models.CharField(max_length=200) last_modify = models.DateTimeField() class Meta: managed = False # 告诉Django不要维护这个表的结构 db_table = "YOUR_ORACLE_TABLE_NAME" # 填实际的Oracle表名
这种方式你可以直接使用Django ORM的查询、增删改接口,不需要手动拼接Raw SQL,既降低出错概率,也能避免SQL注入风险。
只有当你的目标Oracle表的结构本身也会频繁变更(比如会动态增删字段、修改字段类型),固定Model无法适配的情况下,才需要使用django.db.connection.cursor执行原生SQL处理数据。
动态更新表的增删改实现
底层表数据频繁变更的场景下,核心要解决的是并发修改冲突问题,推荐用乐观锁方案实现,逻辑如下:
- 目标表中需要存在可用于标识数据版本的字段,比如最后修改时间
last_modify、或者版本号字段version - 看板加载行数据时,同时保存该行的版本标识值
- 用户提交修改/删除请求时,在更新/删除的过滤条件中加上版本标识匹配的规则:
示例修改代码:
from django.db import transaction # row_id为要修改的行主键,page_load_last_modify是页面加载时拿到的该行last_modify值 with transaction.atomic(): update_count = TargetOracleTable.objects.filter( id=row_id, last_modify=page_load_last_modify ).update( data_col="用户输入的新值", last_modify=models.functions.Now() # 更新最后修改时间戳 ) if update_count == 0: # 没有匹配到行,说明该行数据已经被外部系统修改,返回冲突提示 return "当前行数据已被更新,请刷新页面后重试"
如果业务场景允许覆盖更新,不需要做冲突校验,也可以直接省略版本判断逻辑,正常执行ORM的增删改操作即可。
内容的提问来源于stack exchange,提问作者EclecticTambourine
相关产品推荐
相关产品推荐

