【问题标题】:How to query on joined table attribute in sqlachemy如何在 sqlalchemy 中查询连接表属性
【发布时间】:2012-05-20 20:30:09
【问题描述】:

我在我的项目中使用 sql alchemy。

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

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

  1. 通知表:[id, sender(FK user.id), receiver(FK user.id), subject, message, status]

  2. 用户表:[id, name, email, address, status]

加入通知模型:

 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 alchemy 过滤器查询:

  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)

请帮忙!

【问题讨论】:

  • 第二个查询中,你的意思是notice.sender.name吗?
  • @jadkik94 对于第二个查询错误是:“InstrumentedAttribute”对象和“比较器”对象都没有属性“名称”
  • @jadkik94 第一次查询同样的错误。

标签: python sqlalchemy


【解决方案1】:

你需要获取一个会话对象,然后做:

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上发布问题)

【讨论】:

  • 您好,我错过了一行有问题的代码,关于通知的代码更新
  • 好的。很奇怪,它应该可以工作...有关其他选项,请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 2015-03-10
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多