ограничение столбца 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 не знает о "положительном" аргументе.



Я мог бы вызвать исключение, если объект создается с отрицательным значением для населения. но я не знаю, как обеспечить, чтобы население оставалось позитивным после обновления.



Спасибо за любые помощь.

739   2  

2 ответов:

К сожалению, на стороне 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 как SQL для типа столбца Integer.

Если это не то, что вы ищете, вы просто хотите убедиться, что плохие данные не достигают база данных, то вам нужно ограничение Check.

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

Я знаю, что это старый, но для того, что это стоит, мой подход состоял в использовании marshmallow (de/serialization and data validation library) для проверки входных данных.

Создайте схему для своей модели как таковую:

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 состоит в том, что вы можете применять все ваши правила целостности данных в одном месте

Comments

    Ничего не найдено.