SQLAlchemy - 动态屏蔽对象中的值

时间:2013-10-04 16:06:19

标签: python 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);

因此,根据这个“掩码”参数,我希望输出为“John Smith”,在False情况下 - 输出未屏蔽,或输出被屏蔽时为“J *** * * h” 。现在显然我可以在这个打印中完成它,但问题是打印分散在代码周围,我看到以受控的集中方式执行此操作的唯一方法是创建具有已屏蔽值的SQLAlchemy对象。那么有什么众所周知的解决方案吗?或者我应该创建自己的会话管理器,这将超载“查询”接口或我错过了一些其他可能的解决方案?

由于

1 个答案:

答案 0 :(得分:1)

这通常是Python中我们用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

请注意,这与查询没有多大关系。在数据到达行集时格式化数据的想法是一种不同的方式,并且有一些方法可以实现这一点,但是如果你只关心引用“text”和“author”的print语句,将它保存为python访问模式可能更方便。