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
相关产品推荐
相关产品推荐

