drno-reg
@drno-reg
см не кратко

Как правильно экспортировать в JOSN значение LOB используя cx_Oracle?

Здравствуйте.

необходимо сделать экспорт информации из Oracle и залить ее в JSON

#из наименований колонок делаю словарь
for i in range(0, len(cursor.description)):
    col_names.append(cursor.description[i][0])
    pp = pprint.PrettyPrinter(width=1024)

#далее разбираю курсор для JSON
for row in cursor:
    count_rows+=1
    row_content_json=[]
    for col, val in zip(col_names, row):
        result_inside[col] = val
        row_content_json.append(result_inside[col])
        # print (col," :: ",val)
    file.write(json.dumps(row_content_json, default = myconverter))


На выходе вместо значений полей LOB возвращается .
Как правильно экспортировать LOB в JSON?
  • Вопрос задан
  • 1139 просмотров
Решения вопроса 1
drno-reg
@drno-reg Автор вопроса
см не кратко
нашел такое решение, вопрос с условностью проверки наличия атрибута read

for row in cursor.fetchall():
    count_rows+=1
    result_inside={}
    row_content=[]
    for col, val in zip(col_names, row):
        # проверяем наличие атрибута у объекта, если CLOB то приеняем read
        if hasattr(val, 'read'):
            result_inside[col] = val.read()
        else:
            result_inside[col] = val
        row_content.append(result_inside[col])
    json_file.write(json.dumps(result_inside, default = myconverter))


у решения выше есть проблема

Internally, Oracle uses LOB locators which are allocated based on the
cursor array size. Thus, it is important that the data in the LOB
object be manipulated before another internal fetch takes place. The
safest way to do this is to use the cursor as an iterator. In
particular, do not use the fetchall() method.

поэтому

for row in cursor:
    count_rows+=1
    result_inside={}
    row_content=[]
    for col, val in zip(col_names, row):
        # проверяем наличие атрибута у объекта, если CLOB то приеняем read
        if hasattr(val, 'read'):
            result_inside[col] = val.read()
        else:
            result_inside[col] = val
        row_content.append(result_inside[col])
    json_file.write(json.dumps(result_inside, default = myconverter))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы