У меня есть две таблицы, prizes
и prize_unlocks
. Я пытаюсь написать запрос, чтобы найти приз, который пользователь ранее не разблокировал.Построение запроса SqlAlchemy существует
Идея состоит в том, что существует таблица призы, которую может выиграть любой пользователь, и есть отслеживание таблиц, которые пользователи выиграли, какие призы. Я использую флягу-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;
EDIT: Есть ответ! 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()
Что неправильный запрос, что вы написали? Возможно, мы могли бы помочь вам исправить это. – univerio