SQLAlchemy:有没有任何好的自动重命名列方法

时间:2013-05-20 08:54:23

标签: python orm sqlalchemy alias

我正在使用SQLAlchemy ORM几天,我正在寻找一种在Session.query()的结果中获取tablename前缀的方法。

例如:

myId = 4
...
data = session.query(Email.address).filter(Email.id==str(myId)).one()

print data.keys()

这会显示:

("address",)

我希望得到类似的东西:

("Email.address",)

是否有任何方法可以执行此操作,而无需更改类属性和表列名称。 这个例子有点虚拟,但在更一般的目的中,我希望在结果中按表名称为所有列名添加前缀,以确保结果始终采用相同的格式,即使有连接查询。 我已经阅读了关于aliased()的内容,这里有很多帖子,但没有让我满意。 有人可以赐教我吗?

谢谢。


编辑:

非常感谢您的回答@alecxe。我终于设法做了我想做的事。这是我的第一批代码,可能还有很多需要改进的地方:

query = self.session.query(Email.address,User.name)
cols = [{str(column['name']):str(column['expr'])} for column in query.column_descriptions]
someone = query.filter(User.name==str(curName)).all()

r = []
for res in someone :
    p = {}
    for c in map(str,res.__dict__):
        if not c.startswith('_'):
            for k in cols:
                if c == k.keys()[0]:
                    p[k[c]] = res.__dict__[c]
    r.append(p)
print r

输出结果为:

[{'Email.address': u'john@foobaz.com', 'User.name': u'John'}]

1 个答案:

答案 0 :(得分:2)

尝试column_descriptions

query = session.query(Email.address)
print [str(column['expr']) for column in query.column_descriptions]  # should print ["Email.address"]

data = query.filter(Email.id==str(myId)).one()

希望有所帮助。