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

Django项目无法向Oracle表插入数据:执行无报错但卡住

问题排查与解决方案

1. 数据库事务/锁阻塞

  • 先检查Oracle数据库是否存在未释放的锁,可能是之前的操作未提交事务导致表被锁住。执行以下SQL查询锁信息:
SELECT s.sid, s.serial#, o.object_name, s.status
FROM v$locked_object lo
JOIN dba_objects o ON lo.object_id = o.object_id
JOIN v$session s ON lo.session_id = s.sid;

找到对应锁的会话后,执行语句杀掉会话:

ALTER SYSTEM KILL SESSION '<sid>,<serial#>';
  • 检查Django事务设置,若循环外存在未提交的事务,会导致所有插入操作等待。可以在循环内用原子事务包裹插入逻辑:
from django.db import transaction

for item in value_list['itens']:
    print(item)
    with transaction.atomic(using='adm_int'):
        Item.objects.using('adm_int').create(
            nature=item['nature'],
            nr_doc=item['nr_doc'],
            name=item['name'],
            value=item['value'],
            type_op=item['type'],
            description=item['history']['description'],
        )

注意:create()方法本身已自动执行save(),额外调用i.save(force_insert=True)属于冗余操作,可能引发异常。

2. 隐性数据校验问题

即使没有显性抛出异常,也可能存在数据不匹配的情况(比如字段长度超限、空值不兼容)。在循环内添加异常捕获,打印详细错误:

for item in value_list['itens']:
    print(item)
    try:
        Item.objects.using('adm_int').create(
            nature=item['nature'],
            nr_doc=item['nr_doc'],
            name=item['name'],
            value=item['value'],
            type_op=item['type'],
            description=item['history']['description'],
        )
    except Exception as e:
        print(f"处理{item['nr_doc']}时出错: {str(e)}")
        continue

3. 数据库驱动/连接池问题

  • 检查cx_Oracle驱动版本是否兼容当前Django和Oracle版本,尝试更新驱动:
pip install --upgrade cx_Oracle
  • 临时修改数据库配置中的CONN_MAX_AGE为0,强制每次操作新建连接,排除连接池失效问题:
# settings.py
DATABASES = {
    'adm_int': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': '你的数据库名',
        'USER': '用户名',
        'PASSWORD': '密码',
        'HOST': '数据库地址',
        'PORT': '端口',
        'CONN_MAX_AGE': 0,
    }
}

4. 批量插入优化

若数据量较大,单条插入可能引发性能瓶颈或阻塞,改用批量插入提升效率:

item_objects = []
for item in value_list['itens']:
    print(item)
    item_objects.append(Item(
        nature=item['nature'],
        nr_doc=item['nr_doc'],
        name=item['name'],
        value=item['value'],
        type_op=item['type'],
        description=item['history']['description'],
    ))

# 分批次插入,每批次100条可根据实际调整
batch_size = 100
for i in range(0, len(item_objects), batch_size):
    Item.objects.using('adm_int').bulk_create(item_objects[i:i+batch_size])

内容的提问来源于stack exchange,提问作者Otávio Augusto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:50:26