数据库约束与模型验证
#python #flask

构建全堆栈应用程序时,在将数据输入数据库之前验证数据非常重要。当需要使用和/或访问数据时,数据库中无效的数据有可能引起许多问题。

为了防止将无效的数据输入数据库,Blask-sqlalchemy提供约束验证作为验证应用程序/与Invalid交易数据的方式数据。

约束
SQLalchemy约束允许在数据库级别控制输入。为此,它们存在于模型中。

可以直接添加到列定义的约束:

  • unique(unique = true):当数据库值需要唯一时,可以添加此约束:name = db.Column(db.String, primary_key=True, unique=True)
  • 无效(nullable = false):当强制性输入值:name = db.Column(db.String, primary_key=True, nullable=False)时,可以添加此约束

在下面的示例中,PET实例必须包括一个名称,并且该名称必须是唯一的(即数据库的名称列中还不存在)。

class Pet(db.Model):
    __tablename__ = pets
    name = db.Column(db.String, primary_key=True, nullable=False, unique=True)
    age = db.Column(db.Integer)
    animal_type = db.Column(db.String)  
    owner_email = db.Column(db.String) 

可以为列和/或表创建的约束:

  • CheckConstraints:可以使用任何有效的SQL和数字比较来验证输入。

在下面的示例中,PET实例包括一个年龄,并且年龄必须大于2。

class Pet(db.Model):
    __tablename__ = pets
    name = db.Column(db.String, primary_key=True)
    age = db.Column(db.Integer, db.CheckConstraint('age > 2'))
    animal_type = db.Column(db.String) 
    owner_email = db.Column(db.String)

验证
Sqlalchemy还提供验证:在类定义的顶部进行的特殊方法调用,并防止该类的新实例保存到数据库,如果他们的数据是预期的。尽管约束和验证都试图防止无效的数据输入数据库,但在数据库级别的控制输入约束输入,而验证在Python ORM级别控制输入。

在下面的示例中,PET实例包括一个所有者电子邮件,该电子邮件地址必须包含一个@,表明它是一个有效的电子邮件地址。

class Pet(db.Model):
    __tablename__ = pets
    name = db.Column(db.String, primary_key=True)
    age = db.Column(db.Integer)
    animal_type = db.Column(db.String)
    owner_email = db.Column(db.String) 

@validates('owner_email')
   def validate_owner_email(self, key, owner_email):
       if '@' not in owner_email:
            raise ValueError("Failed email validation")
       return owner_email

比较数据库约束和模型验证
约束和验证具有相同的目标:确保输入数据库的数据有效。尽管他们有一个共同的目标,但重要的是要了解其功能的不同。在数据库中添加或更新数据时,将始终检查数据库约束。另一方面,仅在通过SQLalchemy Orm添加或更新数据时,才会检查SQLalchemy验证。如果添加或更改了某种其他方式(即通过命令行SQL代码),这些修改将无法通过模型验证。

结论
虽然约束和验证试图实现相同的目标,但限制因素带有增加的安全性。为了确保无效的数据不会在裂缝中滑落,有些人会编写数据库约束,以便它们反映了他们所编写的模型验证。 tldr :如果有可能通过Sqlalchemy Orm添加或通过方法来添加或更新数据,则使用数据库约束是您最好的选择。

资源
“ Sqlalchemy约束。”帆布 - 扁平龙学校,2023年5月31日访问。
“烧瓶塞拉尔例马验证”。帆布 - 扁平龙学校,2023年5月31日访问。
Codersloth。 (2020年,12月22日)。数据库约束,但是为什么? https://codersloth.medium.com/database-constraints-but-why-c283761ec7c6
Long,N。(2017年2月)。保证一致性:数据库约束的情况。 大书呆子牧场https://bignerdranch.com/blog/guaranteed-consistency-the-case-for-database-constraints/
定义约束和索引。 (n.d。)。 Sqlalchemy。从2023年5月31日从https://docs.sqlalchemy.org/en/20/core/constraints.html

检索