2017-06-15 68 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()。

我无法通过在创建表之前添加唯一约束来创建数据库来复制您发布的错误。

但是,我可以通过创建表后添加唯一约束来做到这一点。

希望这会有所帮助!