Python DB连接:ValueError:<cx_Oracle.LOB对象位于0x000001CB4819E5A0>不是unicode或序列

2024-10-02 18:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我正在使用cx_Oracle模块从Oracle数据库中提取一个日期字段。修订后的查询和连接模块包括:

def getInitialData():   
    print("Gathering... ")     
    dsn_tns = cx_Oracle.makedsn('xyz.com', '1234', service_name='DB')
    conn = cx_Oracle.connect(user=r'me', password='password', dsn=dsn_tns) 
    SQLquery = ("""
SELECT REPORTDATE, 

FROM LONGDESCRIPTION 
WHERE 
       REPORTDATE > TO_DATE('01/01/2015 0:00:00', 'MM/DD/YYYY HH24:MI:SS'))""") 
    datai = pd.read_sql(SQLquery, conn)
    datai['REPORTDATE'] = pd.to_datetime(datai['REPORTDATE'], format='%m-%d-%Y')
    print("Data Retrieved")
    return datai

但是,当我稍后尝试通过以下方式处理此问题时:

writer = index.writer()
print("Adding Data, this may take a moment... ")
for i in range(len(initialData)):      
    writer.add_document(docId=initialData.iloc[i]['CONTENTUID'], \
                        content=initialData.iloc[i]['LOWER(LDTEXT)'], \
                        date=initialData.iloc[i]['REPORTDATE'])
writer.commit()

我得到:

ValueError: <cx_Oracle.LOB object at 0x000001CB4819E5A0> is not unicode or sequence

有人看到过这个错误吗?文档/谷歌中没有关于它的内容。这是怎么发生的?这对我来说很奇怪,因为我可以使用不同的日期字段来实现这一点。两者都显示datetime64[ns]的数据类型


Tags: 模块passwordconnwriteroraclepddsnprint
1条回答
网友
1楼 · 发布于 2024-10-02 18:17:46

由于这是一个数据转换问题,了解正在使用的字符集将是有用的信息

一些想法:

  1. 连接时设置character set。为数据使用适当的字符集:

     connection = cx_Oracle.connect(connectString, encoding="UTF-8", nencoding="UTF-8")
    

    如果有NCHAR/NVARCHAR/NCLOB列,则只需使用nencoding

  2. 对于“小”LOB(小于1GB且适合于cx_Oracle内存),您可能希望直接以strings的形式获取它们,因为这样更快。添加类型处理程序:

    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)
    
  3. 检查是否有无法在字符集中处理的损坏数据

相关问题 更多 >