Исключить кое-что из предложения where с помощью ядра SQLAlchemy - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть следующая модель:


class Vote(BaseModel):

  __tablename__ 'vote'

  id = sa.Column(sa.Integer, autoincrement=True, index=True, primary_key=True)
  value = sa.Column(sa.Integer, nullable=False)
  rated_user_id = sa.Column(
      sa.Integer, sa.ForeignKey('user.id', ondelete='cascade'))
  rating_user_id = sa.Column(
      sa.Integer, sa.ForeignKey('user.id', ondelete='cascade'))

И я просто хочу сделать запрос, который дает мне объединенные данные. Тем не менее, я не знаю, как сделать этот запрос. Это мой подход:

query = sa.select(
  [votes, users.alias('u1'), users.alias('u2')],
  use_labels=True
).select_from(votes.join(users.alias('u1'),votes.c.rated_user_id == users.alias('u1').c.id).join(users.alias('u2'), votes.c.rating_user_id == users.alias('u2').c.id))

Купить это не работает, потому что он включает в себя «пользователь» как «u1» в предложении FROM . Спасибо!

1 Ответ

1 голос
/ 05 апреля 2020

Каждый вызов alias() создает уникальный объект-псевдоним, даже если вы присваиваете им одинаковую метку. Вместо этого дайте псевдонимам имя и используйте один и тот же объект в каждой части вашего запроса:

u1 = users.alias('u1')
u2 = users.alias('u2')

query = sa.select([votes, u1, u2], use_labels=True).\
    select_from(votes.
                join(u1, votes.c.rated_user_id == u1.c.id).
                join(u2, votes.c.rating_user_id == u2.c.id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...