使用SQLAlchemy核心从where子句中排除某些内容

时间:2020-04-04 19:03:56

标签: python sqlalchemy

我有以下模型:


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))

购买它不起作用,因为它在 FROM 子句中将“ user”包括为“ u1”。 谢谢!

1 个答案:

答案 0 :(得分:1)

每次调用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))