2017-06-15 69 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. 如果這是一個測試/開發環境,只需刪除表並再次運行db.create_all()。

我無法通過在創建表之前添加唯一約束來創建數據庫來複制您發佈的錯誤。

但是,我可以通過創建表後添加唯一約束來做到這一點。

希望這會有所幫助!