如何在SQLAlchemy ORM中打印所有列
我在使用SQLAlchemy的时候,想要把我所有模型的属性都打印出来,方式类似于:
SELECT * from table;
不过,我希望在获取每个模型的实例信息时,能对这些信息做点什么。到目前为止,我找到的最好方法是:
for m in session.query(model).all():
print [getattr(m, x.__str__().split('.')[1]) for x in model.__table__.columns]
# additional code
这样做能让我得到我想要的结果,但这个方法有点绕。我其实希望能有一个类似于这样的属性:
m.attributes
# or
m.columns.values
我觉得我可能漏掉了什么,应该有更好的方法来实现这个。我这么做是因为我想把所有内容打印到.CSV文件里,而不想每次都指定我感兴趣的列或属性,我想要所有的(因为有很多模型里有很多列需要打印)。
11 个回答
32
可能这是最简短的解决方案(可以参考最近的文档):
from sqlalchemy.inspection import inspect
columns = [column.name for column in inspect(model).c]
最后一行如果分成三行写,可能会更容易读:
table = inspect(model)
for column in table.c:
print column.name
43
这是一篇旧帖子,但我遇到了一个问题,就是数据库中的列名和实例中映射的属性名不一致。最后我们选择了这个方法:
from sqlalchemy import inspect
inst = inspect(model)
attr_names = [c_attr.key for c_attr in inst.mapper.column_attrs]
希望这能帮助到遇到同样问题的人!
11
看看SQLAlchemy的元数据反射功能。
一个表对象可以被指示从数据库中已经存在的相应数据库模式对象加载关于它自己的信息。这个过程叫做反射。