在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表达式验证。但

  1. 它没有明确是否unique=True在expresssion Field('title', unique=True)也是完全相同的功能
  2. 验证程序对数据库驱动的形式产生什么影响验证。

从书:

注意requires=...是在形式的层面执行,required=True在DAL(插入)的水平执行,而notnulluniqueondelete在强制执行数据库的级别。虽然它们有时可能看起来多余,但在使用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之外)进行插入/更新。