2017-06-15 25 views
2

フィールドの「ユニークな」制約が機能しない理由を理解しようとしています。 Flask、SQLAlchemy、およびSqliteを使用しています。Flask-sqlalchemyのユニークな制約が働かない

from app import db 
from flask_login import UserMixin 

class User(UserMixin, db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(64), unique=True) 
    password = db.Column(db.String(64)) 
    email = db.Column(db.String(120), unique=True) 

    def __repr__(self): 
     return '<User %r>' % self.username 

ユーザー名フィールドに一意制約があるので、私はそれは私が同じユーザー名を持つユーザーを追加することはできないだろうと、期待:

は、モデルを考えてみましょう。しかし、それはありません。

シェルから:

from app import db 
from app.models import User 

user = User(username='test') 
user2 = User(username='test') 

db.session.add(user) 
db.session.commit() 

db.session.add(user2) 
db.session.commit() 

User.query.all() 

出力:

[<User 'test'>, <User 'test'>] 

私は何かが足りないのですか?

+1

実際には、モデル定義だけでなく、データベースにも固有の制約がありますか? – univerio

答えて

0

テーブルを初めて作成した後にunique = Trueを追加しましたか?その場合、制約はデータベースに適用されません。これをどのように進める必要があるかは次のとおりです。

  1. フラスコの移行を使用します。これは、既存のデータベースモデルを移行できるようにするために非常に便利です。

  2. これがテスト/ dev環境の場合は、テーブルを削除してdb.create_all()をもう一度実行してください。

テーブルを作成する前にユニーク制約を追加してデータベースを作成するだけで投稿したエラーを複製できませんでした。

ただし、テーブルを作成した後に一意制約を追加することでこれを行うことができました。

希望すると便利です。

関連する問題