具有web2py的多列唯一约束

car*_*ier 9 web2py unique-constraint

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

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

Ant*_*ony 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')
Run Code Online (Sandbox Code Playgroud)

这将确保to_currencyfrom_currency匹配from_currency插入的新值的记录集中是唯一的(因此组合from_currencyto_currency必须是唯一的).

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

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


小智 5

您也可以尝试使用Before和After回调.以Anthony的表为例,您可以执行以下操作:

db.rates._before_insert.append( lambda r : db( (db.rates.from_currency==r["from_currency"]) & (db.rates.to_currency==r["to_currency"]) ).select() )
Run Code Online (Sandbox Code Playgroud)

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