构建全堆栈应用程序时,在将数据输入数据库之前验证数据非常重要。当需要使用和/或访问数据时,数据库中无效的数据有可能引起许多问题。
为了防止将无效的数据输入数据库,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