ข้อ จำกัด ของคอลัมน์ 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 ไม่ทราบเกี่ยวกับอาร์กิวเมนต์ 'บวก'

ฉันสามารถยกข้อยกเว้นได้หากวัตถุถูกสร้างอินสแตนซ์ด้วยค่าลบสำหรับประชากร แต่ฉันไม่รู้ว่าจะแน่ใจได้อย่างไรว่าประชากรยังคงเป็นบวกหลังจากการอัปเดต

ขอบคุณสำหรับความช่วยเหลือใด ๆ


person SeanPlusPlus    schedule 08.01.2013    source แหล่งที่มา


คำตอบ (2)


น่าเสียดายที่ในด้านหลาม 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 จะ บ่นเพราะไม่ทราบวิธีการแสดงค่าหลามที่ให้มาเป็น 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'),
        {})
person SingleNegationElimination    schedule 09.01.2013
comment
bar >= 0 ควรเรียกว่า check_bar_non_negative สำหรับ check_bar_positive ฉันคาดหวัง bar > 0 - person Martin Thoma; 30.01.2021

ฉันรู้ว่ามันเก่า แต่สำหรับสิ่งที่คุ้มค่า วิธีการของฉันคือใช้ marshmallow (de/serialization และไลบรารีการตรวจสอบความถูกต้องของข้อมูล) เพื่อตรวจสอบความถูกต้องของข้อมูลอินพุต

สร้างสคีมาให้กับโมเดลของคุณดังนี้:

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 คือคุณสามารถบังคับใช้กฎความถูกต้องของข้อมูลทั้งหมดได้ในที่เดียว

person kip2    schedule 09.01.2018