gpt4 book ai didi

python - SQLAlchemy - 如何使用连接选择 x.id IS NOT NULL AS?

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:30 25 4
gpt4 key购买 nike

我正在创建一个类似于 Twitter 的简单关注系统,所以我有一个表,它是一个有向图,由以下字段组成:id、from_user (int)、to_user (int)

class Follower(Base):
__tablename__ = 'user_follower'
id = Column(Integer, primary_key=True)
from_user = Column(ForeignKey('user.id'), nullable=False)
to_user = Column(ForeignKey('user.id'), nullable=False)

我基本上想在 SQLAlchemy 中实现的是:

SELECT f1.id, f1.from_user, f1.to_user, f2.id 
IS NOT NULL AS followed_back FROM user_follower f1
left outer join user_follower f2 on f1.from_user = f2.to_user and f1.to_user = f2.from_user
WHERE f1.to_user = :uid

换句话说,我需要生成一个名为 followed_back 的列,以告知用户是否也在关注某个关注者。

这在 SQLAlchemy 中似乎很成问题,因为文档中似乎没有太多关于创建 SELECT AS 语句和连接的内容。此外,我不太确定在查询创建对象后如何引用 followed_back 成员变量。

最佳答案

@Wolph 的回答完全涵盖了您的问题。

作为替代方案:如果你的表 Follower 只是为了启用多对多关系,你可以将它建模得更更干净:

users_followers = Table(
'users_follower', Base.metadata,
Column('id', Integer, primary_key=True),
Column('from_user', ForeignKey('user.id')),
Column('to_user', ForeignKey('user.id')),
UniqueConstraint('from_user', 'to_user', name='UC_users_follower'),
)


class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
name = Column(String)

followers = relationship(
'User',
secondary=users_followers,
primaryjoin=id == users_followers.c.to_user,
secondaryjoin=id == users_followers.c.from_user,
backref="followees",
# cascade='all',
)

在这种情况下,您可以按如下方式编写查询:

U1 = aliased(User, name="u1")
U2 = aliased(User, name="u2")
q = (session
.query(
U1, U2,
U2.followers.any(User.id == U1.id).label("followed_back"),
)
.join(U2, U1.followers)
# .filter(...)
# .order_by(...)
)

for u1, u2, follows in q:
print(u1, u2, follows)

这个查询不会更快,但它更容易与模型相关联,它还为您提供有关用户的其他信息(姓名等),我认为您无论如何都需要这些信息。

关于python - SQLAlchemy - 如何使用连接选择 x.id IS NOT NULL AS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com