从 sqlAlchemy 表模型中获取表列

Posted

技术标签:

【中文标题】从 sqlAlchemy 表模型中获取表列【英文标题】:get table columns from sqlAlchemy table model 【发布时间】:2014-09-17 12:51:52 【问题描述】:

我有一个表,我想在其中获取所有列名,但是在浏览了互联网后,我找不到可行的方法。这是我的桌子的样子:

class myTable(Base):
    __tablename__ = 'myTable'

    col1 = Column(Integer, primary_key=True)
    col2 = Column(Unicode(10))
    col3 = Column(Integer)

    col4 = Column(Numeric(10, 6))
    col5 = Column(Numeric(6,3))
    col6 = Column(Numeric(6,3))

    child = relationship('tChild',
                          backref=backref('children'))

我希望能够从 for 循环中打印所有列名。例如:

"col1", "col2", "col3".... etc

使用常规 sql 这很容易,但我似乎无法弄清楚如何使用 sqlAlchemy 表模型来做到这一点

【问题讨论】:

【参考方案1】:

您从__table__.columns 获得所有列:

myTable.__table__.columns

myTable.__table__.c

列的格式为myTable.col1(包括表名)。如果您只需要列名,请为每列获取.key

[column.key for column in myTable.__table__.columns]

【讨论】:

我觉得我太着迷于它没有出现在我认为它不存在的智能感知中。谢谢,只是为了更准确地将其添加到您的答案中,因为这正是我想要的:for col in myTable.__table__.columns: print "col: " + col.description 我可以这样动态地为 myTable 实例赋值吗? 有没有办法动态分配列值?假设我有一个包含列名和值(colName:val)的字典,是否可以迭代表并通过字典填充适当的列而不执行一堆 if 语句?我问是因为一切都是动态完成的 @john: 通常的setattr(myobj, 'column_name', value) 应该可以工作 - 就像任何其他 Python 对象一样 获取列名的更简单方法(不使用列表理解):myTable.__table__.columns.keys()【参考方案2】:

下面是基于@ChaimG 答案的 sqlalchemy 表的一般as_dict 实现。还有一个使用它实现的__repr__ 的附加示例。

from orm.base import Base


class MyTable(Base):
    __tablename__ = 'table_name'

    # Columns go here.....

    def as_dict(self):
        """
        Helper function that allows traversing the table's instance columns as key values

        :return: (key, value) iterator
        """
        for key in self.__table__.columns.keys():
            value = self.__getattribute__(key)
            yield key, value

    def __repr__(self):
        """
        General __repr__ implementation for an sqlalchemy table
        """
        values = []
        for key, value in self.as_dict():
            key_value_str = f"key=value"
            values.append(key_value_str)

        values_str = ", ".join(values)
        cls_name = self.__class__.__name__
        return f"<cls_name(values_str)>"

【讨论】:

以上是关于从 sqlAlchemy 表模型中获取表列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLAlchemy 核心选择除 postgresql 中的 1 个特定列之外的所有表列?

如何从 sqlalchemy 中的 session/engine/meta 获取表名及其数据类型?

如何从一个表列中获取值,将它们与字符串连接并将它们插入另一个表中?

sqlalchemy 映射的小例子

Python 学习笔记 - SQLAlchemy(下)

使用 Flask-SQLAlchemy 在 Alembic 自动生成迁移中未检测到任何变化