python - CLOB/NCLOB 错误的 Cx_Oracle OutputTypeHandler
问题描述
我正在使用 cx_Oracle for Python 7.3.0 从 Oracle 数据库表中下载数据。我注意到,每当我下载和处理一些包含 CLOB/NCLOB 数据的表时,我的速度都会大大降低。
如此处所示:https ://cx-oracle.readthedocs.io/en/latest/user_guide/lob_data.html#fetching-lobs-as-strings-and-bytes 我想尝试以字符串和字节的形式获取 LOB。
我想我做的一切都是正确的,但代码仍然抛出错误。我还检查了使用 OutputTypeHandler 更改其他类型(即数字类型),并尝试在连接级别而不是光标级别进行更改 - 没有一个有效。
代码:
import cx_Oracle
import csv
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.DB_TYPE_CLOB:
return cursor.var(cx_Oracle.DB_TYPE_LONG, arraysize=cursor.arraysize)
if defaultType == cx_Oracle.DB_TYPE_NCLOB:
return cursor.var(cx_Oracle.DB_TYPE_LONG, arraysize=cursor.arraysize)
ip=1.2.3.4
port=8888
SID='DB1'
dsn_tns=cx_Oracle.makedsn(ip,port,SID)
db=cx_Oracle.connect('USER', 'PASS',dsn_tns)
cursor=db.cursor()
cursor.arraysize=500
cursor.outputtypehandler = OutputTypeHandler
cursor.execute("SELECT * FROM dual").fetchall() #or any other table, of course
db.close()
错误信息:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-106-bbcd7561378d> in <module>
16 cursor.arraysize=500
17 cursor.outputtypehandler = OutputTypeHandler
---> 18 cursor.execute("SELECT * FROM dual").fetchall()
19 db.close()
20
<ipython-input-106-bbcd7561378d> in OutputTypeHandler(cursor, name, defaultType, size, precision, scale)
2 import csv
3 def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
----> 4 if defaultType == cx_Oracle.DB_TYPE_CLOB:
5 return cursor.var(cx_Oracle.DB_TYPE_LONG, arraysize=cursor.arraysize)
6 if defaultType == cx_Oracle.DB_TYPE_NCLOB:
AttributeError: module 'cx_Oracle' has no attribute 'DB_TYPE_CLOB'
解决方案
cx_Oracle 8 添加了一些新的常量。
查看cx_Oracle 7.3 文档,您将使用较旧的名称,例如:
def OutputTypeHandler(cursor, name, defaultType, size, precision, scale):
if defaultType == cx_Oracle.CLOB:
return cursor.var(cx_Oracle.LONG_STRING, arraysize=cursor.arraysize)
if defaultType == cx_Oracle.BLOB:
return cursor.var(cx_Oracle.LONG_BINARY, arraysize=cursor.arraysize)
推荐阅读
- python - 如何从包含的可调用对象中使用 config.add_settings({'pyramid.includes': ...})
- c - C:执行 I/O 操作并发送信号导致 select() 不断被中断?
- python - 具有可变输入形状的 Keras
- haskell - 具有固定大小的完美平衡树的问题
- javascript - 授权承载令牌的邮递员预请求脚本
- kotlin - 在 kotlin 是否有任何 hacky 方法来重新分配参数
- angular - 什么是 ViewChild 的好用例阅读:ElementRef
- python - 将数据结构(集合)存储为文件但不将其加载到内存中
- python-3.x - 月份格式化为名称时对日期时间列进行排序
- javascript - 如何获取名称中有多个空格的 json 属性?