可以将特定列标记为unique = true。 在web2py中处理多列唯一约束的最正确方法是什么?
例如,假设我有一个汇率表。它可以包含从货币到货币和汇率的列。拥有两个具有相同from和to货币的行是没有意义的。什么是最优雅或正确的方法,使得从/组合独特?
答案 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_currency
在from_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()
查询返回除None
或False
之外的任何内容,则会中止当前db.rates.insert()
并将False
作为返回值。
请注意,它仍然不会创建一个UNIQUE CONSTRAINT,但它比使用某些客户端验证更安全。