2011-12-13 18 views
0

我將電子郵件地址保存在兩個表中:userid和domain。模型看起來像這樣:SQLAlchemy和連接有一個奇怪的問題

class Email(): 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Unicode, ForeignKey('domain.id')) 
    parent = relationship('Domain') 
    userid = Column(Unicode) 

class Domain(): 
    id = Column(Integer, primary_key=True) 
    host = Column(Unicode) 

我突然開始有聯接的問題。當我這樣做,我總是得到無:

def get_email(email): 
    fragments = email.lower().split(u'@') 
    return DBSession().query(Email).filter(Email.userid == fragments[0]).join(Domain, Domain.id == Email.parent_id).filter(Domain.host == fragments[1]).first() 

但如果我分開這個連接到兩個查詢,檢索到正確的對象:

def get_email(email): 
    fragments = email.lower().split(u'@') 
    session = DBSession() 
    thehost = session.query(Domain).filter(Domain.host == fragments[1]).first() 
    return session.query(Email).filter(Email.userid == fragments[0]).filter(Email.parent_id == thehost.id).first() 

任何人都知道我做錯了,或者我應該如何進行故障排除?我花了最後的30分鐘無濟於事......謝謝!

+0

「域」類實際上是否具有「id」屬性?你忘了在你的例子中顯示它? 無關的建議,我不會使用'local'作爲變量名稱,因爲它與內置函數local()衝突。 –

+0

是的。是的,我剛剛結束了使用片段,而不是命名每個片段,因爲我認爲本地這個詞是一個問題,但這並沒有幫助。 –

+1

爲什麼'Email.parent_id'的類型是'Unicode',而'Domain.id'是'Integer'?順便說一句,你可以省略'ForeignKey'列的類型來讓SQLAlchemy推斷它。 –

回答

0

找出問題所在。與繼承和別名有關。課程:如果連接從同一對象繼承的兩個對象,則至少爲其中一個對象設置別名!