【问题标题】:Is there a way to specify min and max values for integer column in slqalchemy?有没有办法在 sqlalchemy 中指定整数列的最小值和最大值?
【发布时间】:2022-10-07 21:37:29
【问题描述】:

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    age = Column(Integer)# i need age to have mix value of 0 and max of 100 
    email = Column(String)

sqlalchemy 文档说在创建列时没有这样的属性可以传递

【问题讨论】:

    标签: python sqlalchemy integer max min


    【解决方案1】:

    brunsonanswer 中所述,如果数据库支持检查约束,您可以添加检查约束以在数据库中执行验证。

    import sqlalchemy as sa
    ...
    class Test(Base):
        __tablename__ = 'test'
    
        id = sa.Column(sa.Integer, primary_key=True)
        age = sa.Column(sa.Integer, sa.CheckConstraint('age > 0 AND age < 100'))
    

    在将数据发送到数据库之前,在应用程序层执行验证可能更方便。在这种情况下,可以使用 orm.validates 装饰器:

    class Test(Base):
        __tablename__ = 'test'
    
        id = sa.Column(sa.Integer, primary_key=True)
        age = sa.Column(sa.Integer, sa.CheckConstraint('age > 0 AND age < 100'))
    
        @orm.validates('age')
        def validate_age(self, key, value):
            if not 0 < value < 100:
                raise ValueError(f'Invalid age {value}')
            return value
    

    【讨论】:

    • 您忘记从 validate_age 方法返回 value。在您的示例中,年龄将始终为None。但是很好的解决方案。
    • @MiroslavValcicak 好地方,谢谢!
    【解决方案2】:

    这可能是因为我熟悉的 RDBMS 都不支持列定义中的最小值/最大值。

    如果您需要强制您可以编写触发器,或者如果您的数据库支持它,您可以添加检查约束。

    https://dev.mysql.com/blog-archive/mysql-8-0-16-introducing-check-constraint/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2021-07-23
      • 2013-06-27
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多