使用SQLAlchemy动态获取列名称

时间:2015-10-03 20:18:21

标签: python sql sqlite python-2.7 sqlalchemy

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

import db

...

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

以下是db class的一个片段:

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'对象没有属性' column_descriptions'"错误。

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

1 个答案:

答案 0 :(得分:4)

您可以使用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语法。

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