Невозможно сохранить список данных dict с объектом cx_ Oracle LOB в файл JSON - PullRequest
0 голосов
/ 12 марта 2020

У меня есть запрос на выбор, который выполняется через библиотеку cx_ oracle. Выходные данные этого запроса хранятся в виде списка dict, и его необходимо сохранить в файле json для будущего использования и повторений.

Но выходные данные этого запроса имеют «объект cx_oracleLOB» и из-за я застрял с ошибкой " TypeError: Объект типа LOB не JSON сериализуемый " и не может записать в файл json. Пожалуйста, найдите мой код:

con = cx_Oracle.connect(***)
cursor = con.cursor()
cursor.execute(q)

col_names = [row[0] for row in cursor.description]
rv = cursor.fetchall()
json_data = []
for result in rv:
    json_data.append(dict(zip(col_names, result)))
with open("result.json",'w')as fp:
     fp.write(json.dumps(json_data))

sample output of selectquery:

[
  {
    "name": "abc",
    "age": 10,
    "skills": <cx_Oracle.LOBobjectat0x00000123>
  },
  {
    "name": "def",
    "age": 10,
    "skills": <cx_Oracle.LOBobjectat0x000004456>
  }
]

1 Ответ

0 голосов
/ 13 марта 2020

Из документации cx_ Oracle Извлечение больших объектов в виде строк и байтов , создайте обработчик типа вывода:

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)

Это предполагает, что ваши большие объекты поместятся в памяти (и каждый 1 Гб или меньше), но вы, похоже, уже делаете это предположение.

...