2013-01-08 3 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

불행히도, 파이썬 측면에서 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 (드/직렬화 및 데이터 유효성 검사 라이브러리)을 사용하는 것이다.

같은 모델에 스키마를 만듭니다

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

드를 사용의 장점은/직렬화 라이브러리는 다음과 같습니다 적절한 때

from marshmallow import validate, fields, Schema 

... 

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

그런 다음 데이터를 역 직렬화/직렬화 스키마를 사용 한 곳에서 모든 데이터 무결성 규칙을 적용 할 수 있습니다.