SQL Alchemy如何覆盖“==”运算符

3
我正在创建一个表示用户凭据的SQLAlchemy类。
我想要有一个字段password,用于存储密码的哈希值。因此,我想以以下方式覆盖其行为:
  1. 当分配credentials.password = value时,它实际上存储值的哈希值

  2. 当比较credentials.password == value时,它实际上与值的哈希值进行比较

我已经阅读了SQLAlchemy文档的以下部分http://docs.sqlalchemy.org/en/rel_0_7/orm/mapper_config.html#using-descriptors-and-hybrids 我认为我已经理解了如何解决第一个问题。
然而,我不确定如何解决第二个问题。有没有一种安全的方法可以做到这一点(不会破坏SQLAlchemy)?
以下是示例模型:
class Credentials(Base):
    __tablename__ = 'credentials'

    id = Column(Integer, primary_key=True)

    _password = Column('password', String)

    @hybrid_property
    def password(self):
        return self._password

    @password.setter(self):
        self._password = hash(self._password)

你能否发布你当前的模型和一个小测试案例? - plaes
通过测试用例,我指的是一个小的自包含脚本,就像这里所示:https://dev59.com/6Gox5IYBdhLWcg3wi0zF#9140163 - plaes
1个回答

2

对于比较密码,由于无法解密,您需要为Column类创建一个自定义类型,覆盖eq运算符:

class MyPasswordType(String):
    class comparator_factory(String.Comparator):
        def __eq__(self, other):
            return self.operate(operators.eq, hash(other))

请看:http://docs.sqlalchemy.org/en/latest/core/types.html#types-operatorshttp://docs.sqlalchemy.org/en/latest/core/types.html#sqlalchemy.types.TypeEngine.comparator_factory。只需传入值即可进行设置。
@password.setter
def password(self, value):
    self._password = hash(value)    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接