从 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 获取表名及其数据类型?