SQLALchemy:根据列键/名称获取行元素

Posted

技术标签:

【中文标题】SQLALchemy:根据列键/名称获取行元素【英文标题】:SQLALchemy: Get row elements based on columns key/name 【发布时间】:2018-09-02 13:26:54 【问题描述】:

我要做什么

使用 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 文件:

|编号 |一些字符串 |

这是通过获取所有 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 文件中。

代码

部分代码已经在what works中提到过。添加了两个 for 循环,用于迭代查询结果(外部)和每个结果值(内部)。 col_idquery_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")

问题

如果我将列键存储在数组或列表中,我如何访问查询结果行的元素?

【问题讨论】:

【参考方案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 is not iterable”错误。 pip 说,SQLAlchemy 是最新的。 你可以试试item = item.__dict__ ? 成功了!你刚刚保存了我最后的头发:D 非常感谢。

以上是关于SQLALchemy:根据列键/名称获取行元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中加载嵌套关系?

我可以根据 SQLAlchemy 中的另一个数据库行添加新项目吗?

使用 SQLAlchemy 从 PostgreSQL 行对象中获取单个值

在 sqlalchemy 中使用 distinct()/group_by() 获取基于每个“名称”列的最新记录

flask_sqlalchemy获取动态 model名称 和 动态查询

SQLAlchemy中的模型名称