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

82 投票
9 回答
155603 浏览
提问于 2025-04-16 20:09

我正在做一个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()

我该如何从这个结果中获取列名呢?

补充说明:我不能使用这个方法,因为我使用的是声明式语法。

9 个回答

79
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import (Column, Index, Date, DateTime, Numeric, BigInteger, String, ForeignKey, Boolean)

Base = declarative_base()

class Project(Base):
    """sqlalchemy ORM for my table."""
    __tablename__ = "table1"
    id = Column("id", BigIntegerID, primary_key=True, autoincrement=True)
    date = Column("date", Date, nullable=False)
    value = Column("value", Numeric(20, 8))
    ...
    ...

这样做会返回列的名称,比如 ['id', 'date', 'value', ...]:

Project.__table__.columns.keys()

或者这样:

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

你可以像Foo Stack的回答那样做,而不需要使用私有字段,方法是:

conn.execute(query).keys()
39

这里的区别在于ORM和非ORM,而不是声明式的,声明式只是ORM的一个辅助工具。

查询中有一个属性叫做 column_descriptions,是为了这个目的而添加的:

https://docs.sqlalchemy.org/en/20/orm/queryguide/query.html#sqlalchemy.orm.Query.column_descriptions

撰写回答