Что я пытаюсь сделать
Используя SQLAlchemy (с ORM), я сейчас пытаюсь создать такую функцию, как:
export_database_table_to_excel_file( database_orm_object )
с database_orm_object, например
class database_orm_object(db.Model):
id = db.Column(db.Integer, primary_key=True)
some_string = db.Column(db.String(30), unique=True)
Идея состоит в том, чтобы сгенерировать таблицу Excel, которая печатает ключи столбцов в виде строки заголовка, за которой следует одна строка для каждой записи базы данных. Поскольку функции можно передать любую таблицу базы данных, количество столбцов и имена неизвестны.
Что работает
Пока что я могу создать таблицу со строкой заголовков, например, в приведенном выше примере выводом будет файл Excel, содержащий две ячейки:
| id | some_string |
Это делается путем получения всех столбцов database_orm_object и их ключей. Затем ключи добавляются к (пустому) файлу Excel в памяти.
def create_download_file(database_orm_object):
book = Workbook()
sheet = book.active
col_headers = database_orm_object.__table__.columns.keys()
sheet.append(col_headers) # add column keys as header row
book.save("generated.xlsx")
Что не работает
Я не знаю, как получить доступ к элементам записи в базе данных. Мой план состоял в том, чтобы создать два цикла for: внешний цикл, который выполняет итерацию по всем строкам в результате query.all (), и внутренний цикл, который выполняет итерацию по значениям database_orm_object. Внутренний цикл добавляет значения в массив, внешний цикл затем добавляет этот массив в виде строки таблицы в файл Excel.
Код
Часть кода уже упоминалась в что работает. Два цикла for были добавлены и предназначены для перебора результатов запроса (внешний) и каждого значения результатов (внутренний). col_id и query_result.col_id - это разные типы, и они предназначены для иллюстрации того, чего я хочу достичь:
def create_download_file(database_orm_object):
book = Workbook()
sheet = book.active
col_headers = database_orm_object.__table__.columns.keys()
sheet.append(col_headers) # add column keys as header row
for item in database_orm_class.query.all():
row = [] # create an empty row
for col_id in col_headers: # ??? iterate over columns
row.append(item.col_id) # ??? add table row's value for this column
sheet.append(row) # append all the tables row values to excel file
book.save("generated.xlsx")
Вопрос
Как я могу получить доступ к элементу строки результата запроса, если у меня есть ключи столбца, хранящиеся в массиве или списке?






Вы можете попробовать это в новой версии sqlAlchemy:
for item in database_orm_class.query.all():
item = dict(item)
# your code
Или для более старой версии:
for item in database_orm_class.query.all():
item = item.__dict__
# your code
можно попробовать item = item.__dict__ ?
Это сработало! Вы только что сохранили последние мои волосы: D Большое спасибо.
Спасибо за ваше предложение! К сожалению, я получаю ошибку «database_orm_class не повторяется». Пип говорит, что SQLAlchemy обновлена.