web2py唯一约束未被强制执行

时间:2017-09-26 07:35:23

标签: sqlite web2py

我是web2py的新手。我正在申请文件注册。每个文件都分配了一个编号,对于注册年份是唯一的。我试图有一个计算字符串字段,结合数字和年份,强制执行uploadProgress约束。

我使用的是webite,即web2py默认数据库。我的表定义:

upload

和控制器:

unique=True

未强制执行唯一约束,并且正在将相同的值插入表中。我不明白为什么。 SQLite文档说 NULL值被认为与所有其他值不同,包括其他NULL ,因此添加了db.define_table('doc_master_new', Field('sr_no', 'string', unique=True, notnull=True, compute=lambda r: str(r['inward_no']) + '/' + str(r['inward_date'].year)), Field('inward_no', 'integer'), Field('inward_date', 'date', default=request.now), Field('doc_date', 'date'), Field('doc_type', db.doc_type, requires=IS_IN_DB(db, db.doc_type, '%(type_code)s', orderby=db.doc_type.id)), Field('applicant_type'), ## creditor/borrower/third-party Field('no_defect', 'boolean', default=False), Field('time_stamp', 'datetime', default=request.now) ) 约束,但仍允许重复。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

最有可能在最初创建表后添加了unique=True 。尽管DAL处理迁移,但它不会对UNIQUENOT NULL等约束进行更改 - 如果要在创建表后更改这些约束,则必须通过其他约束执行某些操作工具。

另外,请记住,unique=True是在数据库级别强制执行的,而不是表单输入。这意味着如果用户提交违反约束的值,数据库驱动程序将抛出异​​常,用户将看到错误票证。相反,可以考虑在表单提交时强制执行约束,可能通过.process() sr_no。这样,您可以防止将重复的组合发送到数据库,并向用户报告友好的错误消息。

最后,如果Info.plist字段的唯一目的是强制执行唯一性约束,请考虑设置多列唯一性约束(您必须在DAL之外执行此操作,但不提供一种定义这种约束的机制。)