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_date)
)
)
和
user_questions_count = self.request.db.query(
sa.func.count(QuestionAnswer.id).label('questions_amount')
).filter(
sa.and_(
QuestionAnswer.user_id == user_id,
sa.between(QuestionAnswer.created, start_date, end_date)
)
)
是否可以有一个查询而不是这两个?
解决方案
简单的子查询应该可以解决问题:
q = session.query(user_logins_count.subquery(), user_questions_count.subquery())
logins_count, questions_count = q.first()
在检索实例本身的同时获取信息的另一种方法是使用:User
hybrid_method
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)
添加questions_count
可以以相同的方式完成。
推荐阅读
- python - 如何在python中正确地将长文本编码为utf-8?
- java - 在java中逐行读取文件
- python - 如何使用 Python 加载图像?
- android - Kotlin list.map with if 改变返回值
- sql - 协助 Firebird SQL 存储过程
- python - 如何从firebase实时数据库中删除使用python
- swift - 为什么我不能将本地类变量传递给 Swift 中新实例化的类?
- ios - 我遇到了 TAP 付款的问题
- javascript - 从反应原生底部选项卡导航器的标题导航
- c++ - 为什么这个分配给 std::vector 索引会失败?