我定义了以下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 *** ** h”。现在显然可以在此打印件中执行此操作,但是问题是打印件分散在代码周围,而我看到的以受控集中方式执行此操作的唯一方法是创建具有已屏蔽值的SQLAlchemy对象。那么有没有众所周知的解决方案?还是应该只创建自己的会话管理器以使“查询”界面超载,还是我缺少其他可能的解决方案?
谢谢
最佳答案
在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
请注意,这与查询没有多大关系。格式化数据到达行集中的想法是另一种方法,尽管您只担心引用“文本”和“作者”的打印语句,但是也有一些方法可以实现这一点。将其保留为python访问模式可能更方便。
关于python - SQLAlchemy-动态屏蔽对象中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19185824/