Ошибка значения: Не удается преобразовать [] в Excel

#python #python-3.x #excel #postgresql #openpyxl

Вопрос:

Я пытаюсь запустить программу, которая подключается к базе данных postrgres, выполняет запрос и сохраняет этот результат в электронной таблице Excel.

Проблема, с которой я сталкиваюсь, возникает во время выполнения запроса. Результат столбца «член» имеет пустое {}.

   rolname   | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvaliduntil | memberof | rolreplication | rolbypassrls
------------ ---------- ------------ --------------- ------------- ------------- -------------- --------------- ---------- ---------------- --------------
 joe        | f        | t          | f             | f           | t           |           -1 |               | {}       | f              | f
 postgres   | t        | t          | t             | t           | t           |           -1 |               | {}       | t              | t
 test_joe   | f        | t          | f             | f           | t           |           -1 |               | {}       | f              | f
 

Из-за этого мой код возвращает этот вывод с ошибкой.

 Traceback (most recent call last):
  File "/path/to/file.py", line 55, in <module>
    GetPostgresqlData()
  File "/path/to/file.py", line 52, in GetPostgresqlData
    ws.append(row)
  File "/path/to/.local/lib/python3.9/site-packages/openpyxl/worksheet/worksheet.py", line 665, in append
    cell = Cell(self, row=row_idx, column=col_idx, value=content)
  File "/path/to/.local/lib/python3.9/site-packages/openpyxl/cell/cell.py", line 116, in __init__
    self.value = value
  File "/path/to/.local/lib/python3.9/site-packages/openpyxl/cell/cell.py", line 215, in value
    self._bind_value(value)
  File "/path/to/.local/lib/python3.9/site-packages/openpyxl/cell/cell.py", line 184, in _bind_value
    raise ValueError("Cannot convert {0!r} to Excel".format(value))
ValueError: Cannot convert [] to Excel
 

Что я должен сделать, чтобы результат этого столбца и других был записан в электронную таблицу Excel?

Вот запрос, который я выполняю в своей тестовой базе данных.

 SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid) as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
 

Вот мой код.

 def GetPostgresqlData():

    wb = Workbook()
    wb.remove(wb['Sheet'])
    ws = wb.create_sheet(0)
    ws.title = 'Titulo 01'

    hosts = open('serverlist.csv', 'r')
    hosts = hosts.readlines()[1:]

    for i in range(len(filequery[1:])):
        with open(filequery[i 1], 'r') as postgresql_query:
            query = postgresql_query.read()

            for row in hosts:
                command_Array = row.strip('n').split(',')
                db_host = command_Array[0]
                db_port = command_Array[1]
                db_name = command_Array[2]
                db_user = command_Array[3]
                db_password = command_Array[4]

                postgresql_connection = psycopg2.connect(user=db_user,
                                                         password=db_password,
                                                         host=db_host,
                                                         port=db_port,
                                                         database=db_name)

                cursor = postgresql_connection.cursor()
                cursor.execute(query)
                colnames = [desc[0] for desc in cursor.description] 
                records = cursor.fetchall()

            ws.append(colnames)
            for row in records:
                ws.append(row)
                wb.save("postgresql.xlsx")

GetPostgresqlData()
 

Комментарии:

1. Исключение говорит само за себя: вы не можете сохранить список в одной ячейке. Пожалуйста, укажите соответствующий код Python, который вы используете: сам SQL-запрос не имеет отношения к делу.

2. Спасибо за ответ, Чарли. Я отредактировал свой пост и добавил свой код.

3. Итак, теперь вам следует отладить код, чтобы увидеть, как выглядит одна из строк, возвращенных из запроса. КСТАТИ. проверьте отступы в коде, потому что это выглядит немного странно.

Ответ №1:

Проблема, с которой я столкнулся, на которую указал Чарли Чак в первом комментарии, заключается в том, что я не могу сохранить список в одной ячейке. Поэтому я решил проблему, преобразовав массив в строку, как показано ниже.

 SELECT r.rolname, r.rolsuper, r.rolinherit,
  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
  r.rolconnlimit, r.rolvaliduntil,
  array_to_string(ARRAY(SELECT b.rolname
        FROM pg_catalog.pg_auth_members m
        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
        WHERE m.member = r.oid), ',', '*') as memberof
, r.rolreplication
, r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1