Python 结合两个查询,sqlalchemy
我对sqlalchemy(以及sql)都是新手,所以请不要开枪 我有两个问题:Python 结合两个查询,sqlalchemy,python,sqlalchemy,Python,Sqlalchemy,我对sqlalchemy(以及sql)都是新手,所以请不要开枪 我有两个问题: user_logins_count = self.request.db.query( sa.func.count(UserSession.id) ).filter( sa.and_( UserSession.user_id == user_id, sa.between(UserSession.date_login_session, start_date, end_dat
user_logins_count = self.request.db.query(
sa.func.count(UserSession.id)
).filter(
sa.and_(
UserSession.user_id == user_id,
sa.between(UserSession.date_login_session, start_date, end_date)
)
)
及
可以用一个查询代替这两个查询吗?假设
UserSession
和questionresponse
是两个表,其中user\u id
可以用作
query(UserSession).join(QuestionAnswer, UserSession.user_id = QuestionAnswer.user_id)
加入表格。如果您有一个联接,那么您可以更轻松地将它们作为一个单元进行查询,假设它们都具有您需要的日期信息
也就是说,您需要检查一些复杂的内容,执行两个查询并将它们连接起来可能比使用复杂的子查询更有意义。或者,这可能是最有意义的做一个
如果您发布您的数据结构,我可以更具体地帮助您构建一个可以做您想做的事情的查询。这当然是可能的,但可能会变得有点棘手,因此查看您正在使用的数据示例和您构建的数据模型(构成QuestionAnswer和UserSession表基础的类)将非常有帮助
参考资料
- 简单应该做到:
q = session.query(user_logins_count.subquery(), user_questions_count.subquery())
logins_count, questions_count = q.first()
另一种更复杂的方法是,在检索
用户实例时,同时获取信息的方法是:
添加questions\u count
也可以用同样的方法完成。基于联接的解决方案有点令人不快的问题是需要广泛处理子表中没有行或没有符合条件的行的情况。
q = session.query(user_logins_count.subquery(), user_questions_count.subquery())
logins_count, questions_count = q.first()
class User(Base):
__tablename__ = "user"
id = Column(Integer, primary_key=True)
name = Column(String(255))
@hybrid_method
def user_logins_count(self, start_date: datetime, end_date: datetime):
return len(
[
_login
for _login in self.sessions
if start_date <= _login.date_login_session <= end_date
]
)
@classmethod
@user_logins_count.expression
def user_logins_count_(cls, start_date: datetime, end_date: datetime):
return (
select([func.count(UserSession.id).label("user_logins_count")])
.where(UserSession.user_id == cls.id)
.where(UserSession.date_login_session >= start_date)
.where(UserSession.date_login_session <= end_date)
.group_by(UserSession.user_id)
.label("user_logins_count")
)
res = session.query(User, User.user_logins_count(start_date, end_date)).filter(
User.id == user_id
)
user, logins_count = res.first()
print(user)
print(logins_count)