2013-01-08 100 views
4

如何使用燒瓶sqlalchemy將列定義爲正整數?正方形燒瓶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的不知道一個「積極」的說法。

我可以引發一個異常,如果一個對象實例化爲一個負值的人口。但我不知道如何確保更新後的人口保持積極。

感謝您的任何幫助。

回答

12

不幸的是,在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 抱怨,因爲它不知道如何渲染提供的蟒蛇值作爲列類型爲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'), 
     {}) 
+0

這完美的工作。謝謝! – SeanPlusPlus

1

我知道這是舊的,但對於它的價值,我的方法是使用marshmallow(德/序列化和數據驗證庫)來驗證輸入數據。

創建架構模型是這樣的:

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 
... 

使用去的優點/序列化庫你可以在一個地方執行你所有的數據完整性規則