嘿,我正在使用cx_Oracle模块从Oracle DB中提取日期字段。编辑的查询和连接模块为:
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
有人看到此错误吗?文档/ Google对此一无所知。它是怎么发生的?这对我来说很奇怪,因为我能够使用其他日期字段来使它正常工作。两者都显示datetime64[ns]
由于这是一个数据转换问题,所以知道使用中的字符集将是有用的信息。
一些想法:
连接时设置character set。为您的数据使用适当的字符集。:
connection = cx_Oracle.connect(connectString, encoding="UTF-8", nencoding="UTF-8")
如果您有NCHAR / NVARCHAR / NCLOB列,则只需要使用nencoding
。
对于“小型” 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)
检查是否有字符集中无法处理的数据损坏。