14

フラスコの 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 は「正の」引数について認識していません。

オブジェクトが人口の負の値でインスタンス化されている場合、例外が発生する可能性があります。しかし、更新後に母集団が正のままであることを確認する方法がわかりません。

助けてくれてありがとう。

4

2 に答える 2

29

残念ながら、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!'

このオブジェクトをコミットしようとすると、指定された python 値を列 type の SQL としてレンダリングする方法がわからないため、sqlalcheyInteger文句を言います。

それがあなたが探しているものではない場合、単に悪いデータがデータベースに到達しないようにしたい場合は、Check制約が必要です。

class Foo(Base):
    __tablename__ = 'foo'
    id = Column(Integer, primary_key=True)
    bar = Column(Integer)
    __table_args__ = (
        CheckConstraint(bar >= 0, name='check_bar_positive'),
        {})
于 2013-01-09T00:19:11.293 に答える
2

私はこれが古いことを知っていますが、その価値のために、私のアプローチはマシュマロ(デ/シリアル化およびデータ検証ライブラリ) を使用して入力データを検証することでした。

モデルのスキーマを次のように作成します。

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

逆シリアル化ライブラリを使用する利点は、すべてのデータ整合性ルールを 1 か所で適用できることです。

于 2018-01-09T19:36:29.870 に答える