如何使用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不知道'正面'参数。
如果对象被实例化为总体的负值,我可以引发异常。但我不知道如何在更新后确保人口保持正面。
感谢您的帮助。
答案 0 :(得分:15)
>>> 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库的好处是可以在一个地方强制执行所有数据完整性规则