gpt4 book ai didi

mysql - 使用sqlalchemy过滤连接关系

转载 作者:行者123 更新时间:2023-11-29 02:43:51 25 4
gpt4 key购买 nike

我正在用 sqlalchemy 编写一个查询,我觉得我正在做一些不应该做的事情:我得到的查询太复杂了,所以我认为这不是应该的方式使用数据库/orm。

这是我的架构的简化版本:

class User(Base):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), unique=True, index=True)
longs = db.relationship('Login', backref='users')

class Login(Base):
__tablename__ = 'logins'
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('users.id'))
browser = db.Column(db.String(64)

对于给定的状态,我希望 A 中的所有元素B 中引用 A 的行数小于某个特定数,比方说 5。

对于一个真实的案例,想象一下:A是用户列表B是登录列表:

我想要所有使用 Firefox 登录少于 5 次的用户的列表。这也包括从未登录过的用户!

在 SQL/sqlalchemy 中我会这样做:

1) 使用左连接选择根本没有登录名的行

never_loggedin = session.query(User).join(Login,
Logins.user_id == User.id).\
filter(Login.user_id == None)

2) 选择使用 Firefox 的登录,只取计数小于 5 的登录。

sub_query = session.query(Login).filter(Login.browser ==
browser).subquery()
less_ex = session.query(User).outerjoin(sub_query,
sub_query.c.user_id ==
User.id).group_by(sub_query.c.user_id).having(func.count(User.id) <
repetition)

3) 现在我遇到了问题。可能有用户登录但从未使用 Firefox,并且这些用户未从先前的查询中选择。我不知道如何选择那些。

我的操作是否正确?具体来说,我想我应该使用多对多关系,但我想我会把这个编辑放在软件的下一个重构中。

最佳答案

  sub_query = session.query(Login.user_id).filter(Login.browser == browser).group_by(Login.user_id).having(func.count(Login.id) >= repetition).subquery()
less = session.query(User).filter(~User.id.in_(sub_query))

关于mysql - 使用sqlalchemy过滤连接关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46023336/

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