具有web2py的多列唯一约束

时间:2011-11-08 17:33:45

标签: web2py unique-constraint

可以将特定列标记为unique = true。 在web2py中处理多列唯一约束的最正确方法是什么?

例如,假设我有一个汇率表。它可以包含从货币到货币和汇率的列。拥有两个具有相同from和to货币的行是没有意义的。什么是最优雅或正确的方法,使得从/组合独特?

2 个答案:

答案 0 :(得分:7)

假设数据将通过表单输入,您可以使用表单验证器,如下所示:

db.define_table('rates',
    Field('from_currency'),
    Field('to_currency'))

db.rates.to_currency.requires=IS_NOT_IN_DB(
    db(db.rates.from_currency==request.vars.from_currency), 'rates.to_currency')

这将确保to_currencyfrom_currency与插入的from_currency的新值匹配的记录集中是唯一的(因此from_currency和{{的组合1}}必须是唯一的。)

另一种选择是使用onvalidation函数来确认两个值是不同的 - 这将在通常的表单验证之后但在数据库插入之前运行。

最后,您可以通过Javascript进行验证客户端。

答案 1 :(得分:5)

您也可以尝试使用Before and After callbacks。以Anthony的桌子为例,你可以这样做:

db.rates._before_insert.append( lambda r : db( (db.rates.from_currency==r["from_currency"]) & (db.rates.to_currency==r["to_currency"]) ).select() )

如果.select()查询返回除NoneFalse之外的任何内容,则会中止当前db.rates.insert()并将False作为返回值。 请注意,它仍然不会创建一个UNIQUE CONSTRAINT,但它比使用某些客户端验证更安全。