2012-05-19 52 views
0

我在我的項目中使用了sql鍊金術。如何在sqlachemy中查詢已連接的表屬性

我有一個問題,當兩個或多個表加入或有外鍵關係,然後我無法查詢在哪裏條件加入表屬性。

例如,我已經注意到表和用戶表user.id是notice.sender 現在我想通過user.name

  1. 通知表尋人啓事外鍵:[ID,發送方(FK user.id)接收器(FK user.id),主題,郵件,狀態]

  2. 用戶表:[ID,姓名,電子郵件地址,狀態]

加盟通知型號:

sender_user = relationship('User', primaryjoin='Notice.sender==user.id', backref=backref("sender_user")) 
receiver_user = relationship('User', primaryjoin='Notice.receiver==user.id', backref=backref("receiver_user")) 

SQL鍊金術篩選查詢:

user_name='john' 

    notice=db_session.query(Notice) 
    notice = notice.filter(Notice.sender_user.name == user_name) 

下面的查詢不工作:

notice=db_session.query(Notice) 
    notice = notice.filter(Notice.user.name == user_name) 

請幫幫忙!

+1

在第二個查詢中,你的意思是'notice.sender.name'嗎? – jadkik94

+1

你的錯誤是什麼? – jadkik94

+0

@ jadkik94對於第二個查詢錯誤是:對於第一個查詢,'InstrumentedAttribute'對象和'Comparator'對象都沒有屬性'name' – anils

回答

0

你需要獲得一個會話對象,然後執行:

query = session.query(Notice).filter(Notice.sender_user.name == user_name) 
results = query.all() 

如果不工作(你沒有得到你所期望的結果),嘗試這樣做:

session.query(Notice, User.name).filter((Notice.sender_user.id == User.id) & (User.name == user_name)) 
results = query.all() 

我想你也有一個名爲sender的字段,它是用戶的ID。然後,這也應該工作:

session.query(Notice, User.name).filter((Notice.sender == User.id) & (User.name == user_name)) 

重試所有這些,我做了一些小的修改。 (你可以在修訂歷史中看到它們)。如果他們不工作會很奇怪...(如果他們不這樣做,請嘗試在SQLAlchemy mailing list上發佈問題)

+0

嗨,我錯過了有問題的一行,關於什麼是通知的代碼更新 – anils

+0

好的。這很奇怪,它應該已經工作了...查看我更新的答案以瞭解其他選項。 – jadkik94