构造SqlAlchemy存在查询

时间:2017-02-06 07:46:16

标签: python sqlalchemy

我有两个表,prizesprize_unlocks。我试图写一个查询来查找用户之前没有解锁过的奖品。

这个想法是,任何用户都可以获得一个奖品表,并且有一个表跟踪用户赢得了哪些奖品。我使用flask-sqlalchemy,表格定义如下:

class Prize(db.Model):
  __tablename__ = 'prizes'
  id = db.Column(db.Integer, primary_key = True)
  # ... some other info about the prize...


class PrizeUnlock(db.Model):
  __tablename__ = 'prize_unlocks'
  id = db.Column(db.Integer, primary_key = True)

  # associated prize
  prize_id = db.Column(db.Integer, db.ForeignKey('prizes.id'))
  prize = db.relationship('Prize',
    backref=db.backref('prize_unlocks'))

  # associated user
  user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
  user = db.relationship('User',
    backref=db.backref('prize_unlocks'))

我正在尝试编写单个SqlAlchemy查询,以从用户以前获胜的奖品中选择随机奖品。据我了解,我需要用exists子句编写查询,但我无法做到正确。

有人可以帮帮忙吗?

如果有任何帮助,相应的sql查询如下所示:

select p.id from prizes as p where not exists (select * from prize_unlocks where prize_unlocks.prize_id=r.id) order by rand() limit 1;

编辑:得到了答案! metmirr非常接近,但我只是在这里发布最终答案,以防将来帮助某人。

db.session.query(Prize.id).filter(
  not_(
    db.session.query(PrizeUnlock)
      .filter(Prize.id == PrizeUnlock.prize_id)
      .exists()
  )
).order_by(Prize.id).limit(10).all()

1 个答案:

答案 0 :(得分:1)

在过滤函数中使用子查询:

db.session.query(Prize.id).filter(
    db.session.query(PrizeUnlock.id)
        .filter(Prize.id == PrizeUnlock)
        .exists()
).order_by(Prize.id).limit(1)