【问题标题】:web2py_uuid() returning same value over multiple invocations?web2py_uuid() 在多次调用中返回相同的值?
【发布时间】:2016-05-26 16:55:03
【问题描述】:

我已在auth_user 表中添加了uuid 字段,并将该字段的default 值设置为web2py_uuid(),如下所示:

模块:

class User_Custom(Base):
    def __init__(self, ...):
        ...
        auth.settings.extra_fields['auth_user']= [
            Field('uuid', type='string', default = web2py_uuid(), 
                        readable=False, writable=False, label=current.T('UUID')),
                ]

我正在使用一些自定义函数来填充我的数据库,并发现auth_user 中的每个用户都以相同的uuid 值结束。

`populate.py' 模型文件:

def create_user():
    user_dict = dict(
          first_name = random.choice(FIRST_NAMES),
          last_name = random.choice(LAST_NAMES),
          email = ...,
          password = ..,
          )
    return db.auth_user.insert(**user_dict)

def create_profile(count = 100):
    for idx in range(count):
        user_id = create_user()
        # create a bunch of data for tables referenced by db.auth_user

我的印象是,以上述方式创建的每个用户都会有一个唯一的 uuid(即,每次创建用户时都会调用 web2py_uuid,并且每次都会生成唯一的输出)。 uuid 值在由单个调用create_profile() 生成的所有用户之间是一致的预期行为吗?如上例中使用default参数时,有没有办法保证每个用户都有一个唯一的uuid值?

【问题讨论】:

    标签: web2py


    【解决方案1】:

    通过调用web2py_uuid() 函数,您将生成单个 UUID,然后将其设置为该字段的默认值。该值将作为整个请求的默认值持续存在,因此在该请求期间插入的任何记录都将获得相同的 UUID。如果您希望为每个插入生成单独的默认值,则必须提供一个函数作为默认值,并且 DAL 将在每个插入时自动调用该函数。所以,应该是:

    Field('uuid', default=web2py_uuid, ...)
    

    注意,default=web2py_uuid 而不是 default=web2py_uuid()

    来自文档:

    default 设置字段的默认值。如果未明确指定值,则在执行插入时使用默认值。它还用于预填充使用SQLFORM 从表构建的表单。请注意,默认值不是一个固定值,而是一个函数(包括一个 lambda 函数),它为字段返回适当类型的值。在这种情况下,即使在单个事务中插入了多条记录,也会为插入的每条记录调用一次该函数。

    【讨论】:

    • 知道了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多