SQLALchemy: получение элементов строки на основе ключа / имени столбца

Что я пытаюсь сделать

Используя 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")

Вопрос

Как я могу получить доступ к элементу строки результата запроса, если у меня есть ключи столбца, хранящиеся в массиве или списке?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
1 771
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать это в новой версии 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

Спасибо за ваше предложение! К сожалению, я получаю ошибку «database_orm_class не повторяется». Пип говорит, что SQLAlchemy обновлена.

L. Heinrichs 02.09.2018 16:35

можно попробовать item = item.__dict__ ?

Son Nguyen 02.09.2018 16:43

Это сработало! Вы только что сохранили последние мои волосы: D Большое спасибо.

L. Heinrichs 02.09.2018 16:45

Другие вопросы по теме