如何从SQLAlchemy结果中获取列名(声明性语法)

时间:2011-06-23 14:19:14

标签: python sqlalchemy pylons pyramid

我正在金字塔项目中工作,我在SQLAlchemy中使用声明性语法

"""models.py"""
class Projects(Base):
    __tablename__ = 'projects'
    __table_args__ = {'autoload': True}

我使用

获得结果
""""views.py"""
session = DBSession()
row_data = session.query(Projects).filter_by(id=1).one()

如何从此结果中获取列名。

PS:我无法使用this方法,因为我使用的是声明性语法。

7 个答案:

答案 0 :(得分:42)

你可以做一些类似于Foo Stack答案的事情而不诉诸私人领域:

conn.execute(query).keys()

答案 1 :(得分:26)

区别在于ORM和非ORM,而不是声明,这只是ORM的帮助。

Query有一个为此目的添加的方法column_descriptions() ::

http://www.sqlalchemy.org/docs/orm/query.html#sqlalchemy.orm.query.Query.column_descriptions

示例似乎有一个拼写错误,q.columns说,但它应该是q.column_descriptions(编辑:只修复它)。

答案 2 :(得分:23)

Project.__table__.columns.keys()

然后,这将返回列名[' id',' date',' value',...]:

Project.metadata.tables['table1'].columns.keys()

或者这个

<asp:ScriptManager>

答案 3 :(得分:7)

只是玩一下,这个语法会给你所有的列(所以要解决你的问题,设置查询只查看一个表/对象):

conn.execute(query)._metadata.keys

答案 4 :(得分:2)

此链接显示如何获取有关表,列等的所有元数据。

SQLAlchemy Metadata

以上许多答案均基于此页面上的信息。 假设我们已经声明了一个表。

 Rails.application.config.action_controller.raise_on_unfiltered_parameters = true

以下是获取有关表元数据的一些示例。

employees = Table('employees', metadata,
    Column('employee_id', Integer, primary_key=True),
    Column('employee_name', String(60), nullable=False),
    Column('employee_dept', Integer, ForeignKey("departments.department_id"))
)

答案 5 :(得分:2)

只是

>>> q[0].keys()

之后

row_data = session.query(Projects).filter_by(id=1).one()

示例:

>>> q = session.query(users_user.phone,users_user.first_name).filter(users_user.phone=='79267548577').limit(1).all()
>>> columns_names = q[0].keys

结果:

>>> q[0].keys()
['phone', 'first_name']
>>> 

答案 6 :(得分:-1)

想扩展@zzzeek 的回答。确实 Query 具有 column_descriptions 属性,但并非适用于所有方法。

考虑以下两个查询:

1. query = session.query(Projects).filter_by(<filter_condition>)
2. query = session.query(Projects).all() <-- This query does not have column_descriptions.

因此,如果您遇到需要使用 column_descriptions 属性但使用 ...query(...).all() 的情况,那么您可以将其更改为 ...query(...).filter_by()filter_by() 而不需要任何过滤条件。