2017-02-06 3 views
0

У меня есть две таблицы, 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() 
+0

Что неправильный запрос, что вы написали? Возможно, мы могли бы помочь вам исправить это. – univerio

ответ

1

Использование подзапросов в функции фильтра:

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

Сладкий, это было достаточно близко к ответу, который я нашел. Благодаря! – Abs

Смежные вопросы