2017-01-27 5 views
2

나는 다음과 같은 SQLAlchemy의 쿼리를 실행할 수 있어야합니다.SQLAlchemy의 부울 하이브리드 특성

SQLAlchemy의 모델 :

class Action(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    action  = db.Column(db.String(32)) 
    done  = db.Column(db.Boolean, default=False) 
    batch  = db.relationship(Batch.__name__, backref='actions') 

class Batch(db.Model): 
    id    = db.Column(db.Integer, primary_key=True) 
    name    = db.Column(db.String(255), default='unknown') 

    @hybrid_property 
    def total_actions(self): 
     return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).count() 

    @hybrid_property 
    def finished_actions(self): 
     return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).filter(Action.done).count() 

    @hybrid_property 
    def done(self): 
     return self.total_actions == self.finished_actions 

나는에 많은 성공없이 해당 expression을 구현했습니다. 부울 쿼리를 반환 할 수있는 방법을 이해하는 것은 어렵습니다. total_actionsfinished_actions 모두 hybrid attributes을하고, 따라서 doneexpression에서 사용할 수 없습니다

@done.expression 
def done(self): 
    total_actions = db.session.query(func.sum(Batch.actions)) 
    finished_actions = db.session.query(func.sum(Batch.actions.done)) 
    return db.session.query(Batch).filter(total_actions == finished_actions) 
+1

쿼리 객체에'.as_scalar을()'를 호출 시도 – ThiefMaster

답변

0

문제는 : 이것은 내 겸손 시도이다.

값 대신 쿼리를 반환하는 각각에 대해 해당 expression을 추가해야했습니다. 여기

는 전체 코드입니다 :

class Action(db.Model): 
    id   = db.Column(db.Integer, primary_key=True) 
    action  = db.Column(db.String(32)) 
    done  = db.Column(db.Boolean, default=False) 
    batch  = db.relationship(Batch.__name__, backref='actions') 

class Batch(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 

    @hybrid_property 
    def total_actions(self): 
     return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).count() 

    @total_actions.expression 
    def total_actions(cls): 
     return (select([func.count(Action.id)]). 
       where(Action.bid == cls.id). 
       label("total_actions")) 

    @hybrid_property 
    def finished_actions(self): 
     return db.session.query(Action).join(Action.batch).filter(Batch.id == self.id).filter(Action.done).count() 

    @finished_actions.expression 
    def finished_actions(cls): 
     return (select([func.count(Action.id)]). 
       where(Action.bid == cls.id). 
       where(Action.done). 
       label("finished_actions")) 

    @hybrid_property 
    def done(self): 
     return self.total_actions == self.finished_actions 

    @done.expression 
    def done(cls): 
     return cls.total_actions == cls.finished_actions