2016-12-31 1 views
0

어떤 이유로 sqlalchemy에서 수동 조인 (Query.join not joinedload)을 사용했습니다. 하나의 테이블에 여러 개의 조인이 있으므로 별칭을 사용했습니다. 이제 관계의 필드 중 하나에 의해 결과를 정렬하고 싶습니다. 별칭 이름으로 Query.order_by를 어떻게 사용할 수 있습니까? 이 작업을 수행 할 때 쿼리의 필드 이름 대신 모호한 % (####)가 표시됩니다.sqlalchemy의 조인 별칭으로 정렬

 if self.order_by: 
     entity = self.cls 
     for field, order in self.order_by: 

      if '.' in field: 

       m = re.match(r'(.+)\.(.+)', field) 

       if m.group(1) not in self.aliases: 

        for item in m.group(1).split('.'): 

         cls = inspect(entity) 
         attr = cls.attrs[item] 
         entity = get_type(attr) 

         if attr.innerjoin: 
          aliased_entity = aliased(entity) 
          self.aliases[m.group(1)] = aliased_entity 
          _query = _query.join(aliased_entity, item).options(contains_eager(item, 
                         alias=aliased_entity)) 
         else: 
          aliased_entity = aliased(entity) 
          self.aliases[m.group(1)] = aliased_entity 
          _query = _query.outerjoin(aliased_entity, item).options(contains_eager(item, 
                           alias=aliased_entity)) 

      if order == "desc": 
       _query = _query.order_by(self.get_order_by_field(field).desc()) 
      else: 
       _query = _query.order_by(self.get_order_by_field(field).asc()) 

: 그리고

def get_order_by_field(self, field: str) -> Column: 
     if '.' in field: 
      m = re.match(r'(.+)\.(.+)', field) 
      if m.group(1) in self.aliases: 
       return getattr(self.aliases[m.group(1)], m.group(2)) 
      else: 
       return Column(self.column_map[field]) 
     else: 
      return Column(field) 

답변

1

참조 exsample에 :

entity = sqlalchemy.aliased(ModelUser) 
session.query(ModelLog.id, ModelLog.date, ModelUser.id.label('current_user_id'), 
       entity.id.label('prev_user_id'))) \ 
     .join(ModelUser, ModelUser.id == ModelLog.id_model_user) \ 
     .join(entity, entity.id == ModelLog.id_prev_model_user) \ 
     .filter(...) \ 
     .order_by(entity.id.asc(), ModelUser.id.desc() 
+0

나는 여기에 코드의 일부를 넣어해야합니다. 위의 검토. – Kamyar