这取决于您想要做什么。默认情况下,web2py会自动创建一个自增id
字段作为每个表的主键,这是尽可能推荐的方法。如果您正在处理具有复合主键的旧数据库并且无法更改架构,则可以指定primarykey
属性,尽管有一些限制(如所解释的here):
db.define_table('pairing',
Field('user', writable=True, readable=True),
Field('uid', writable=True, readable=True),
primarykey=['user', 'uid'])
也许您实际上并不需要真正的复合主键,但您只需要某种方法来确保仅将唯一的用户/uid 值对插入到表中。在这种情况下,您可以通过指定正确构造的IS_NOT_IN_DB
两个字段之一的验证器:
db.define_table('pairing',
Field('user', writable=True, readable=True),
Field('uid', writable=True, readable=True))
db.pairing.uid.requires=IS_NOT_IN_DB(db(db.pairing.user==request.vars.user),
'pairing.uid')
这将确保uid
在记录集中是唯一的,其中user
匹配新值user
被插入(所以组合user
and uid
必须是唯一的)。请注意,验证器(例如 IS_NOT_IN_DB)仅在通过插入值插入时应用。SQLFORM
或使用.validate_and_insert()
方法,因此上述方法不适用于表中的任意插入,但主要用于用户输入提交。
您还可以使用 SQL 在表上设置多列唯一约束(您可以直接在数据库中或通过 web2py 执行此操作).executesql()
方法)。即使有这样的限制,您仍然希望在应用程序中进行一些输入验证,以避免数据库出现错误。