Python Соединение с БД: ValueError: не является юникодом или последовательностью - PullRequest
0 голосов
/ 17 марта 2020

Эй, я вытягиваю поле даты из базы данных Oracle с помощью модуля cx_ 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

Имеет кто-нибудь видел эту ошибку? Ничего в документации / гугле об этом. Как это случилось? Это странно для меня, потому что я могу заставить это работать, используя другое поле даты. Оба показывают dtype datetime64[ns]

1 Ответ

2 голосов
/ 17 марта 2020

Поскольку это проблема преобразования данных, знание используемой кодировки было бы полезной информацией.

Некоторые мысли:

  1. Установить символ установите при подключении. Используйте соответствующий набор символов для ваших данных. «маленькие» большие объекты (размером <1 ГБ и помещаемые в память cx_ Oracle), вы, вероятно, захотите извлечь их напрямую как <a href="https://cx-oracle.readthedocs.io/en/latest/user_guide/lob_data.html#fetching-lobs-as-strings-and-bytes" rel="nofollow noreferrer"> строки , поскольку это быстрее. Добавьте обработчик типа:

    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)
    
  2. Проверьте, не повреждены ли данные, которые не могут быть обработаны в наборах символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...