2016-05-03 3 views
0

に同じデフォルトのIDをプッシュ:SQLAlchemyのは、私は、ランダムなユーザーIDを作成するには、このメソッドを持って作成

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)) 

そしてユーザーのために、このSQLAlchemyのオブジェクト:

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

私の問題は、次のとおりです。時にはそれ(問題を起こさずに新しいユーザーを登録して作成するユーザーもいます)user.iddefaultが既に使用されていて、このエラーが発生することがあります。

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

このエラーは、少なくとも半分は発生します。

答えて

3

問題は、モデル定義でgenerate_id関数を呼び出すことです。つまり、アプリケーションが最初に値を開始するときだけ(各スレッド/サーバーごとに1回)生成されます。

SQLAlchemyのは、呼び出し可能なデフォルト値を受け入れているので、あなたは、単にそれが内部で自動的に呼び出されます()を削除することができます

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

うんを!多くの意味があります。呼び出し可能なデフォルトについて知らなかった!あなたは私の一日を作った:) – Jivan

関連する問題