sqlite 使用SQLAlchemy动态获取列名

jljoyd4f  于 2023-04-30  发布在  SQLite
关注(0)|答案(1)|浏览(185)

我使用SQLAlchemy查询sqlite db,如下所示:

import db

...

results = session.query(table).all()
        for result in results:
            print result
            print "how to print column name?"

下面是一个db类的代码片段:

class Device(Base):
    __tablename__ = "devices"
    name = Column(String(250), primary_key=True)
    location = Column(String(250), nullable=False)

    def __init__(self, name, location):
        self.name = name
        self.location = location

尝试使用“。column_descriptions”在结果中抛出“'list' object has no attribute 'column_descriptions'"错误。
动态获取列名和值的正确方法是什么?我希望这样做,这样我就可以构建一个函数来处理所有查询的JSON转换,而不是到处重复代码。

k97glaaz

k97glaaz1#

您可以使用Device.__table__.columns获取代码中Device模型中的列列表。这些是Column对象,您可以在迭代时对它们使用.name来获取名称。然后当你查询的时候,你可以使用getattr或者其他东西来获取你需要的值。

编辑:

示例:

col_names = Device.__table__.columns.keys()  # This gets the column names
sample_row = Device.query.first()  # I just query for a random row
required_values = {name: getattr(sample_row, name) for name in col_names}
# This is a dictionary comprehension

也许您还可以使用select语法。

EDIT2:

这是一篇关于dictionary comprehension的文章
好的,这个字典理解所做的是,它从我查询的示例行中获取键作为列的名称,值作为相应列的值。
你想打印一个list,所以我们可以这样做:
用这个替换字典理解行。

print([getattr(sample_row, name) for name in col_names])

这将在列表中打印该行的值,但您不会获得列名。
但为此,您可以创建元组列表。

print([(name, getattr(sample_row, name)) for name in col_names])

但是,要做到这一点,一个更简单的方法可能是使用SQLAlchemy提供的select语法。
文档地址: www.example.com

相关问题