Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 结合两个查询,sqlalchemy_Python_Sqlalchemy - Fatal编程技术网

Python 结合两个查询,sqlalchemy

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

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


可以用一个查询代替这两个查询吗?

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