【问题标题】:get table columns from sqlAlchemy table model从 sqlAlchemy 表模型中获取表列
【发布时间】: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 表模型来做到这一点

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案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})>"
    

    【讨论】:

      猜你喜欢
      • 2011-09-22
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多