2013-05-20 20 views
4

我使用SQLAlchemy ORM幾天,我正在尋找一種方法來獲得Session.query()的結果中的表名前綴。SQLAlchemy:有什麼好的自動化方法來重新命名列

例如:

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'[email protected]', 'User.name': u'John'}] 

回答

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() 

。希望幫助。

相關問題