Flask、SQLAlchemy 中的约束和验证初学者指南

因此,您来这里是为了了解 Flask 中 SQLAlchemy 的约束和验证。但在深入了解细节之前,让我们快速了解一下 Flask 是什么。

Flask 是一个用 Python 编写的轻量级 Web 框架,通常被称为“微框架”,因为它没有捆绑大量工具或库。与大型框架不同,Flask 不包含内置数据库抽象层、表单验证或其他组件,因此开发人员可以自由地集成根据项目需求定制的第三方库。尽管 Flask 本质上是极简的,但它具有高度的可扩展性。借助各种扩展,开发人员可以轻松添加对象关系映射、表单验证、文件上传、身份验证等功能,从而使 Flask 既灵活又可扩展。

现在,让我们讨论一下约束和验证。约束有助于确保只有适当的数据才会保存到数据库中,而验证则确保输入的数据既合理又可行。但我们如何在 Flask 和 SQLAlchemy 中实际实现约束和验证呢?让我们来探索一下!

约束

在数据库环境中,约束是应用于表列的规则,用于确保所存储数据的完整性和有效性。约束对于维护数据的干净和一致至关重要,可防止将无效值添加到数据库中。

当将 SQLAlchemy 与 Flask 结合使用时,可以在模型类中轻松定义约束。最常用的两个约束是可空和唯一:

  • 可空约束:这可确保列不能包含 NULL 值,这意味着字段必须始终有一个值。您可以在定义列时设置 nullable=False 来强制执行此操作。例如:
  • class User(db.Model):
        __tablename__ = "users"
    
    id = db.Column(db.Integer, primary_key=True)
    
    password = db.Column(db.String, nullable=False)

    -unique 约束:这可确保列中的所有值都是唯一的,这意味着该列中不能有两行具有相同的值。您可以通过设置 unique=True 来强制执行此操作。例如:

    class User(db.Model):
        __tablename__ = "users"
    
    id = db.Column(db.Integer, primary_key=True)
    
    username = db.Column(db.String, unique=True, nullable=False)

    使用约束有助于保护您的数据库免受无效或不一致数据的侵害,使其成为任何强大应用程序的重要组成部分。

    验证

    验证是一种自动检查,可确保输入系统的数据合理可行。验证是一种保障措施,通过在提交输入之前验证输入的完整性来保护数据库免受无效数据的侵害。

    在 SQLAlchemy 中,验证是在模型内执行的,并且仅在通过 SQLAlchemy ORM 添加或更新数据时触发。这可确保您的应用程序始终执行这些规则。

    为了实现验证,SQLAlchemy 提供了一个方便的 @validates 装饰器。以下是示例:

    class Expense(db.Model, SerializerMixin):
        __tablename__ = "expenses"
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String, nullable=False)  # Name of the expense
        amount = db.Column(db.Float, nullable=False)  # Amount of the expense
        date = db.Column(db.Date, nullable=False)  # Date of the expense
        user_id = db.Column(db.Integer, db.ForeignKey("users.id"), nullable=False)
        category_id = db.Column(db.Integer, db.ForeignKey("categories.id"), nullable=True)
    
        # Relationships
        user = db.relationship("User", back_populates="expenses")
        category = db.relationship("Category", back_populates="expenses")
    
        serialize_rules = ("-user.expenses", "-category.expenses",)
    
        @validates("amount")
        def validate_amount(self, key, value):
            if value <= 0:
                raise ValueError("Amount must be greater than 0.")
            return value
    
        @validates("date")
        def validate_date(self, key, value):
            if not value:
                raise ValueError("Date is required.")
            return value

    在上面的例子中,金额验证确保金额大于 0,如果验证失败则提供错误消息。日期验证确保提供日期值,这对于在数据缺失时提供即时反馈很有用。

    在开发 Web 应用程序时,维护数据完整性至关重要。约束和验证在实现此目标方面发挥着至关重要的作用,可确保数据库中仅存储有效且有意义的数据。

    在数据库级别强制执行的约束是第一道防线,可防止保存无效数据。另一方面,验证在应用程序逻辑中提供了额外的保护层,可提供即时反馈并增强用户体验。

    通过有效地结合这些方法,您可以编写更可靠、更不容易出错且更能处理意外情况的代码。采用约束和验证不仅有助于保护您的数据,而且还能促进干净、可维护且强大的应用程序设计。