web2py中的复合键

2024-06-06 12:17:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在web2py中定义了一个表

db.define_table(
'pairing',
Field('user',writable=True,readable=True),
Field('uid', writable=True , readable=True)
)

此表需要用户和uid的组合是唯一的。我已经看过web2py文档,但是没有直接的方法来定义复合键。 如何在web2py中定义复合方式


Tags: 方法用户文档truefielddbuid定义
2条回答

这取决于你想做什么。默认情况下,web2py会自动创建一个自动递增的id字段,作为每个表的主键,这是尽可能推荐的方法。如果您正在处理具有复合主键的旧数据库,并且无法更改架构,则可以指定一个primarykey属性,尽管有一些限制(如here)所述:

db.define_table('pairing', 
    Field('user', writable=True, readable=True), 
    Field('uid', writable=True, readable=True),
    primarykey=['user', 'uid'])

也许你只需要确保一些键值对是唯一的,但是你不需要用一个真正的键值来代替一些键值。在这种情况下,可以通过为以下两个字段之一指定正确构造的IS_NOT_IN_DB验证器来完成此操作:

^{pr2}$

这将确保uid在一组记录中是唯一的,其中user与插入的{}的新值相匹配(因此user和{}的组合必须是唯一的)。注意,只有通过SQLFORM或使用.validate_and_insert()方法插入值时,才会应用验证器(例如,isnot_IN_DB),因此上述方法不适用于表中的任意插入,而是主要用于用户输入提交。在

您还可以使用SQL在表上设置一个多列唯一约束(可以直接在数据库中或通过web2py.executesql()方法来实现)。即使有这样的约束,您仍然需要在应用程序中进行一些输入验证,以避免数据库中出现错误。在

我一直在使用计算字段来创建/模拟复合键。以上述问题中的示例为例,可以将连接表定义为:

from md5 import md5
db.define_table( 'pairing',
                 Field('user', writable=True, readable=True),
                 Field('uid', writable=True, readable=True),
                 Field( 'user_uid_md5', 
                        length=32,
                        unique=True,
                        writable=False,
                        readable=False,
                        compute=lambda row: md5("{0}:{1}".format(row.user,row.uid)).hexdigest()))

插入和更新时自动计算user_uid_md5字段。此字段的值是从两个字段user和{}获得的字符串的md5哈希。此字段也标记为unique。因此,数据库在这里强制执行唯一性,这将绕过Anthony指出的限制。这也可以用来模拟包含两个以上字段的复合键。如果你发现这种方法有任何漏洞,请告诉我。在

编辑:对md5散列的计算方式进行了轻微的更新,以解释Chen Levy在下面的注释中指出的情况。在

相关问题 更多 >