动态对象中的SQLAlchemy掩码值

2024-09-29 23:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我定义了以下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);

现在我想做的是根据一些逻辑来屏蔽“作者”字段,比如:

^{pr2}$

因此,根据这个“mask”参数,我希望输出是“John Smith”,在False case-output not masked,或“J*****h”,当输出被屏蔽时。显然,我可以用这种打印方式来完成,但问题是打印文件分散在代码中,我认为以集中控制的方式来实现这一点的唯一方法是用已经屏蔽的值创建SQLAlchemy对象。那么有没有什么众所周知的解决办法呢?或者我应该创建自己的会话管理器来重载“查询”接口,还是缺少一些其他可能的解决方案?在

谢谢


Tags: basestring定义sqlalchemy方式columnextclass
1条回答
网友
1楼 · 发布于 2024-09-29 23:26:50

这通常是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访问模式可能更方便。在

相关问题 更多 >

    热门问题