在web2py的pyDAL中`required = True`和`IS_NOT_IN_DB`的等价性
问题描述:
web2py书给出an example of modelling an image blog。相关的代码,以我的问题的范围有:在web2py的pyDAL中`required = True`和`IS_NOT_IN_DB`的等价性
db.define_table('image',
Field('title', unique=True),
Field('file', 'upload'),
format = '%(title)s')
db.image.title.requires = IS_NOT_IN_DB(db, db.image.title)
文指出,像db.image.title.requires
表达式验证。但
- 它没有明确是否
unique=True
在expresssionField('title', unique=True)
也是完全相同的功能 - 验证程序对数据库驱动的形式产生什么影响验证。
答
从书:
注意
requires=...
是在形式的层面执行,required=True
在DAL(插入)的水平执行,而notnull
,unique
和ondelete
在强制执行数据库的级别。虽然它们有时可能看起来多余,但在使用DAL编程时保持区别非常重要。
unique=True
确实正在创建不导致验证。当web2py首先在数据库中创建表(假定您已启用迁移)时,会导致UNIQUE
约束被添加到数据库模式。如果使用违反此约束的值调用DAL .insert()
或.update()
方法,数据库将引发错误(这将导致应用程序中出现Python异常)。
设置requires=IS_NOT_IN_DB(...)
创建一个验证器,当你(一)提交使用SQLFORM
或(b)调用DAL .validate_and_insert()
或.validate_and_update()
方法创建一个表格将被运行。如果验证失败,则插入/更新根本不会发送到数据库,并且您没有得到Python异常,而只是失败的记录(通常在表单提交时显示在表单中)。
如果您将通过表单进行插入和更新,则最好使用验证器,因为它提供了适当的用户体验(即在窗体中显示错误消息)。设置unique=True
以便数据库具有适当的模式也是一个好主意,以防您通过表单以外的方式(甚至可能在web2py或DAL之外)进行插入/更新。