如何在sqlalchemy中查询连接表属性

时间:2012-05-19 07:01:07

标签: python sqlalchemy

我在我的项目中使用sql炼金术。

当两个或多个表连接或具有外键关系时,我遇到一个问题,那么我无法在where where条件下查询连接表属性。

EG。我有通知表和用户表user.id是notice.sender的外键 现在我想通过user.name

搜索通知
  1. 通知表:[id,发件人(FK user.id),接收者(FK user.id),主题,消息,状态]

  2. 用户表:[ID,姓名,电子邮件,地址,状态]

  3. 加入通知模型:

     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 个答案:

答案 0 :(得分: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上发布问题)