2013-10-04 5 views
0

즉시 객체에서 마스크 값 : 내가하고 싶은처럼, 어떤 논리에 따라 뭔가를 "저자"필드를 마스크 할 수 있도록 이제SQLAlchemy의 - 나는 다음과 같은 SQLAlchemy의 클래스가 정의한

Base = sqlalchemy.ext.declarative.declarative_base() 
class NSASecrets(Base): 
    __tablename__ = 'nsasecrets'; 
    id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True); 
    text = sqlalchemy.Column(sqlalchemy.String); 
    author = sqlalchemy.Column(sqlalchemy.String); 

입니다 : 그래서이 "마스크"매개 변수에 따라

if (allowed): 
    nsasecrets = session.query(NSASecrets,**mask=False**); 
else: 
    nsasecrets = session.query(NSASecrets,**mask=True**); 
for nsasecret in nsasecrets: 
    print '{0} {1}'.format(author, text); 

나는 거짓 경우 "존 스미스"로 출력을하고 싶습니다 - 출력은 "J는 *** * *이 시간"출력이 마스크 때 마스크, 또는하지 . 이제 분명히이 인쇄물에서이 작업을 수행 할 수는 있지만 문제는 인쇄물이 코드 주위에 흩어져 있고 통제 된 중앙 집중 방식으로이 작업을 수행하는 유일한 방법은 이미 마스크 된 값으로 SQLAlchemy 개체를 만드는 것입니다. 그래서 거기에 잘 알려진 해결책이 무엇입니까? 아니면 그냥 "쿼리"인터페이스를 오버로드하거나 내게 다른 가능한 솔루션이 누락 된 내 자신의 세션 관리자를 만들어야합니까?

감사

+0

'nsasecret.author'과'nsasecret.text'이어야합니다. 'format'에서 –

+0

그리고'author' 속성 만이 맞습니까? –

답변

1

이 일반적으로 우리가 descriptors라는 뭔가 할 파이썬에서 물건의 종류이다. 설명자를 SQLAlchemy 매핑 된 열과 결합하는 간단한 방법은 synonym을 사용하는 것입니다. 동의어는이 시점에서 조금 날짜가 맞았으므로 hybrids이라는 덜 "마법적인"시스템을 사용합니다. 이 쿼리와 함께 할 일이 많이가 발생하지 않는 것을

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base, synonym_for 
from sqlalchemy.ext.hybrid import hybrid_property 

Base = declarative_base() 

class NSASecrets(Base): 
    __tablename__ = 'nsasecrets' 

    id = Column(Integer, primary_key=True) 
    _text = Column("text", String) 
    _author = Column("author", String) 

    def _obfuscate(self, value): 
     return "%s%s" % (value[0], ("*" * (len(value) - 2))) 

    @hybrid_property 
    def text(self): 
     return self._obfuscate(self._text) 

    @text.setter 
    def text(self, value): 
     self._text = value 

    @text.expression 
    def text(cls): 
     return cls._text 

    @hybrid_property 
    def author(self): 
     return self._obfuscate(self._author) 

    @author.setter 
    def author(self, value): 
     self._author = value 

    @author.expression 
    def author(cls): 
     return cls._author 

n1 = NSASecrets(text='some text', author="some author") 

print n1.text 
print n1.author 

참고 : 어느 아래 하이브리드의 예이며, 여기에 사용할 수 있습니다. 행 집합에 도착할 때 데이터 서식을 지정한다는 생각은 다른 방식이며, 그렇게 할 수있는 방법이 있습니다. "텍스트"와 "작성자"를 참조하는 인쇄 명령문에만 관심이 있다면, 파이썬 액세스 패턴으로 유지하는 것이 더 편리 할 것입니다.