SQLAlchemy,以编程方式检查参数

时间:2016-03-04 01:12:08

标签: python flask sqlalchemy

我想以编程方式检查变量,看它是否是几个允许的字符串之一。我也可以在sql代码中添加一个检查约束,但我真的不想这样做。我知道我可以通过kwargs访问传递给SQLAlchemy对象的参数。断言允许传入参数的最佳方法是什么?

class Attend(db.Model):
  __tablename__ = 'attend'
  uid = db.Column(db.Integer, db.ForeignKey('user.uid'), primary_key=True)
  gid = db.Column(db.Integer, db.ForeignKey('group.gid'), primary_key=True)
  # assert(user_role in GroupRoles.roles) -- want to do something like this
  user_role = db.Column(db.String)
  user = db.relationship('User', back_populates='registered_groups')
  group = db.relationship('Group', back_populates='registered_users')

1 个答案:

答案 0 :(得分:1)

如果要在Python (包括默认构造函数)中分配特定列时验证它,可以使用validates装饰器:

class Attend(db.Model):
    ...
    @validates("user_role"):
    def _validate_user_role(self, key, value):
        assert(user_role in GroupRoles.roles)
        return value

然而,您的特定用例似乎更符合枚举:

user_role = db.Column(db.Enum(*GroupRoles.roles))

这会生成服务器端检查,表示该值有效。在SQLAlchemy 1.1(目前未发布)中,这也执行Python端检查,无需上面的_validate_user_role函数(在SQLAlchemy 1.0及之前仍然需要)。