正整数的flask sqlalchemy列约束

时间:2013-01-08 23:42:54

标签: python sqlalchemy flask-sqlalchemy

如何使用flask sqlalchemy将列定义为正整数?

我希望答案看起来像这样:

class City(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    population = db.Column(db.Integer, positive=True)
    def __init__(self,population):
        self.population = population

然而,这个类定义会抛出错误b / c sqlalchemy不知道'正面'参数。

如果对象被实例化为总体的负值,我可以引发异常。但我不知道如何在更新后确保人口保持正面。

感谢您的帮助。

2 个答案:

答案 0 :(得分:15)

不幸的是,在python方面,sqlalchemy尽力避开;没有'特殊的sqlalchemy'方式来表达实例属性必须满足某些约束:

>>> class Foo(Base):
...     __tablename__ = 'foo'
...     id = Column(Integer, primary_key=True)
...     bar = Column(Integer)
...
>>> f = Foo()
>>> f.bar = "not a number!"
>>> f.bar
'not a number!'

如果您尝试提交此对象,sqlalchey 抱怨,因为它不知道如何将提供的python值呈现为列类型Integer的SQL。

如果这不是你想要的,你只是想确保坏数据没有到达数据库,那么你需要一个Check约束。

class Foo(Base):
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True)
    bar = Column(Integer)
    __table_args__ = (
        CheckConstraint(bar >= 0, name='check_bar_positive'),
        {})

答案 1 :(得分:1)

我知道这是旧的,但是对于它的价值,我的方法是使用marshmallow(de /序列化和数据验证库)来验证输入数据。

为您的模型创建架构:

from marshmallow import validate, fields, Schema

... 

class CitySchema(Schema):
    population = fields.Integer(validate=validate.Range(min=0, max=<your max value>))

然后在适当时使用您的架构序列化/反序列化数据:

... 
city_data = {...} # your city's data (dict)
city_schema = CitySchema()
deserialized_city, validation_errors = city_schema.load(city_data) # validation done at deserialization
... 

使用de / serialization库的好处是可以在一个地方强制执行所有数据完整性规则