2016-05-03 9 views
0

Ich habe diese Methode eine zufällige Benutzer-ID zu erstellen:SQLAlchemy drückt die gleiche Standard-ID auf Schaffung

import random 
import string 

def generate_id(): 
    size = 9 
    chars = string.ascii_uppercase + string.ascii_lowercase + string.digits 
    return ''.join(random.SystemRandom().choice(chars) for _ in range(size)) 

Und dieses SQLAlchemy Objekt für einen Benutzer:

class User(db.Model, UserMixin): 
    __tablename__ = 'user' 
    id = db.Column(db.String, primary_key=True, default=generate_id()) 
    name = db.Column(db.String(255)) 
    # ... 

Mein Problem ist: manchmal ist es funktioniert gut (einige Leute schaffen es, sich anzumelden und einen neuen Benutzer ohne Probleme zu erstellen) und manchmal wurde das generierte default für user.id bereits verwendet und löst diesen Fehler aus:

sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: user.id 

Dieser Fehler tritt mindestens in der Hälfte der Zeit auf.

Antwort

3

Das Problem ist, dass Sie die generate_id Funktion in der Modelldefinition aufrufen. Dies bedeutet, dass nur beim ersten Start Ihrer Anwendung ein Wert generiert wird (einmal für jeden Thread/Server).

Da SQLAlchemy akzeptiert aufrufbar defaults Sie die () einfach entfernen kann so automatisch intern aufgerufen wird:

class User(db.Model, UserMixin): 
    __tablename__ = 'user' 
    id = db.Column(db.String, primary_key=True, default=generate_id) 
    name = db.Column(db.String(255)) 
    # ... 
+0

Yeah! Macht viel Sinn. Wusste nicht über den Callable Default! Du hast meinen Tag gerettet :) – Jivan

Verwandte Themen