2016-05-26 7 views
1

Ich habe ein uuid Feld an die auth_user Tabelle, und stellen Sie die auf web2py_uuid()default Wert dieses Feldes hinzugefügt, wie in den folgenden:web2py_uuid() gibt den gleichen Wert über mehrere Aufrufe zurück?

Modul:

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')), 
       ] 

ich einige benutzerdefinierte Funktionen um meine Datenbank aufzufüllen und zu finden, dass jeder Benutzer in auth_user mit dem gleichen uuid Wert endet.

`populate.py‘ Modelldatei:

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 

Ich hatte den Eindruck, dass jeder in der oben beschriebenen Weise erstellt Benutzer eine eindeutige UUID haben würde (dh, die jedes Mal, wenn ein Benutzer aufgerufen werden web2py_uuid würde geschaffen und dass es jedes Mal eine eindeutige Ausgabe erzeugt). Ist das erwartete Verhalten, dass der Uuid-Wert für alle Benutzer einheitlich ist, die durch einen einzelnen Aufruf von create_profile() generiert werden? Gibt es eine Möglichkeit zu garantieren, dass jeder Benutzer einen eindeutigen Uuid-Wert hat, wenn der Parameter default wie im obigen Beispiel verwendet wird?

Antwort

3

Durch Aufrufen der web2py_uuid()-Funktion generieren Sie eine einzelne UUID und legen diese als Standardwert für das Feld fest. Dieser Wert wird als Standard für die gesamte Anforderung beibehalten, sodass alle Datensätze, die während dieser Anforderung eingefügt werden, die gleiche UUID erhalten. Wenn Sie für jede Einfügung einen separaten Standardwert generieren möchten, müssen Sie stattdessen eine Funktion als Standard angeben, und die DAL ruft diese Funktion bei jeder Einfügung automatisch auf. So soll es sein:

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

Hinweis, default=web2py_uuid statt default=web2py_uuid().

Aus der Dokumentation:

default setzt den Standardwert für das Feld. Der Standardwert wird beim Ausführen einer Einfügung verwendet, wenn ein Wert nicht explizit angegeben ist. Es wird auch verwendet, um Formulare aus der Tabelle mit SQLFORM vorzufüllen. Beachten Sie, dass der Standardwert nicht eine feste Größe, sondern eine Funktion (einschließlich einer Lambda-Funktion) sein kann, die einen Wert des entsprechenden Typs für das Feld zurückgibt. In diesem Fall wird die Funktion für jeden eingefügten Datensatz einmal aufgerufen, auch wenn mehrere Datensätze in einer einzigen Transaktion eingefügt werden.

+0

Verstanden. Vielen Dank! – Boa

Verwandte Themen