2016-11-01 3 views
1

메서드를 사용하여 계산할 열 값 (is_dangerous_token)을 원합니다. 여기까지 제가 지금까지 간 적이 있습니다.Sqlalchemy : 다른 열의 열 값이 자동으로 계산됩니다.

class PassRecovery(DeclarativeBase): 
    __tablename__ = 'pass_recoveries' 

    id = Column(Integer, primary_key=True) 
    account_email_address = Column(Unicode(255), ForeignKey('accounts.email_address'), index=True) 
    account = relationship('Account', backref=backref('pass_recoveries', cascade='all, delete-orphan')) 
    _is_dangerous_token = Column('is_dangerous_token', Unicode(255)) 

    def _set_is_dangerous_token(self, account_email_address): 
     secret_key = config.get('is_dangerous_key') 
     signer = TimestampSigner(secret_key) 
     self._is_dangerous_token = signer.sign(account_email_address) 

    def _get_is_dangerous_token(self): 
     return self._is_dangerous_token 

    is_dangerous_token = synonym(
     '_is_dangerous_token', 
     descriptor=property(_get_is_dangerous_token, _set_is_dangerous_token) 
    ) 

그러나 문제는 내가 EMAIL_ADDRESS에 전달하여 행을 만들 때 is_dangerous_token 내가 쓴 코드를 사용하여 생성되지 않는다는 점이다. 생성 된 행은 id이고 accountis_dangerous_token에 대한 관계는 데이터베이스에 값이 없습니다. 당신이 토큰을 생성하는 값입니다 필요가 있기 때문에 도움

+0

필자가 이해했듯이 모델 구성시 열 값이 자동으로 계산됩니다. 그것은 사실입니까? – pylover

+0

@pylover 예 정확하게 – Juggernaut

답변

1

에 대한 덕분에 당신의 account_email_addresssynonym을 사용해야합니다 :

class PassRecovery(DeclarativeBase): 
    __tablename__ = 'pass_recoveries' 

    id = Column(Integer, primary_key=True) 
    _account_email_address = Column(Unicode(255), ForeignKey('accounts.email_address'), index=True) 
    account = relationship('Account', backref=backref('pass_recoveries', cascade='all, delete-orphan')) 
    is_dangerous_token = Column('is_dangerous_token', Unicode(255)) 

    def _set_account_email_address(self, account_email_address): 
     self._account_email_address = account_email_address 

     secret_key = config.get('is_dangerous_key') 
     signer = TimestampSigner(secret_key) 
     self.is_dangerous_token = signer.sign(self._account_email_address) 

    def _get_account_email_address(self): 
     return self.account_email_address 

    account_email_address = synonym(
     '_account_email_address', 
     descriptor=property(_get_account_email_address, _set_account_email_address) 
    ) 

EDIT 1

Persoan.A는 동의어입니다 가정합니다.

session.query(Person).filter(Person.A > 8) 

따라서 복잡한 식 계산을 위해 쿼리에 데이터베이스에없는 열을 사용할 수 있습니다.

당신은 속성으로 이것을 할 수 없습니다. 동의어 대신 python의 속성을 사용하면 sqlalchemy 동의어의 비용을 피할 수 있습니다.

또 다른 접근법은 sqlalchemy events을 사용하여 속성 변경을 수신 대기하고 이벤트 발생시 원하는대로 수행하는 것입니다.

관련 문제