使用SQLAlchemy动态获取列名

Dom*_*icM 3 python sql sqlite sqlalchemy python-2.7

我正在使用SQLAlchemy查询sqlite数据库,如下所示:

import db

...

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

这是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
Run Code Online (Sandbox Code Playgroud)

尝试根据文档抛出的结果对结果使用“ .column_descriptions”时出现“'list'对象没有属性'column_descriptions'”错误。

动态获取列名和值的正确方法是什么?我想要这个,所以我可以构建一个函数来处理所有查询的json转换,而不是到处重复代码。

ada*_*rsh 6

您可以用来 在代码中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
Run Code Online (Sandbox Code Playgroud)

您也可以使用select语法。

编辑2:

这是一篇关于字典理解的文章

好的,这个字典的理解是将键作为列名,并将值作为我查询的示例行中对应列的值。

您想要打印list,因此我们可以这样操作:

以此替换词典理解行。

print([getattr(sample_row, name) for name in col_names])
Run Code Online (Sandbox Code Playgroud)

这将在列表中打印该行的值,但是您没有得到列名。

但是为此,您可以创建一个元组列表。

print([(name, getattr(sample_row, name)) for name in col_names])
Run Code Online (Sandbox Code Playgroud)

但是,执行此操作的一种更简单的方法可能是使用SQLAlchemy提供的select语法。

此处的文档:http : //docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#selecting