Django+cx_Oracle查询Oracle 11g视图'ORDER'遇ORA-01722错误求助
解决方案:处理Oracle保留关键字作为视图名引发的ORA-01722错误
核心原因
ORDER是Oracle的保留关键字,直接调用会导致SQL解析器混淆——将其识别为ORDER BY的排序关键字,而非视图名称,最终触发ORA-01722错误(属于解析逻辑混乱引发的表象错误)。
具体解决方法
1. 原生RAW查询处理
在原生SQL语句中,必须用双引号"包裹视图名,强制Oracle将其识别为对象名称:
from django.db import connection with connection.cursor() as cursor: # 双引号需保留,视图名大小写要与数据库定义完全一致(Oracle默认存储为大写) cursor.execute('SELECT * FROM "ORDER"') rows = cursor.fetchall()
2. Django模型映射处理
如果通过Django模型关联该视图,需在模型Meta类的db_table属性中用双引号包裹视图名:
from django.db import models class OrderView(models.Model): # 字段与视图结构一一对应,示例字段 order_id = models.IntegerField() order_date = models.DateTimeField() # 其他字段... class Meta: managed = False # 视图无需Django管理表结构 db_table = '"ORDER"' # 用双引号包裹保留关键字视图名
之后即可正常使用ORM查询:
orders = OrderView.objects.all()
3. 直接使用cx_Oracle的处理
若绕过Django直接用cx_Oracle连接查询,同样需要在SQL中用双引号包裹视图名:
import cx_Oracle conn = cx_Oracle.connect(user="你的用户名", password="你的密码", dsn="你的数据库DSN") cursor = conn.cursor() cursor.execute('SELECT * FROM "ORDER"') rows = cursor.fetchall() cursor.close() conn.close()
注意事项
Oracle对象名称默认以大写存储,务必保证双引号内的视图名大小写与数据库中完全匹配,否则会引发对象不存在的错误。
内容的提问来源于stack exchange,提问作者Marek Zacharewicz
相关产品推荐
相关产品推荐

