NOT NULL约束在Flask + SQLite3中失败

时间:2015-10-03 21:37:09

标签: python sqlite flask

我在我的app烧瓶中出现了这个错误

>

但是,我认为代码很好。 我不知道为什么不能正常工作,允许使用无值的值,因为null = True。

我的文件如下

这是我的models.py

IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed:
         auth_user.role [SQL: u'INSERT INTO auth_user (username, email, password, role, status) VALUES (?, ?, ?, ?, ?)']
     [parameters: (u'Natali', u'mail@gmail.com', 'pbkdf2:sha1:1000$p8jlOhqU$fa51e0491a729cef6d05dbd9f1d868455de4be9c', None, None)]

这是我的controller.py

from app import db
from werkzeug import generate_password_hash, check_password_hash

    class User(db.Model):

        __tablename__ = 'auth_user'

        id      = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(128),  nullable=False)
        email    = db.Column(db.String(128),  nullable=False,
                          unique=True)
        password = db.Column(db.String(192),  nullable=False)
        role     = db.Column(db.SmallInteger, nullable=True)
        status   = db.Column(db.SmallInteger, nullable=True)

        def __init__(self, username, email, password):

            self.username = username.title()
            self.email    = email.lower()
            self.password = generate_password_hash(password)

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

        def set_password(self, password):
            self.pwdhash = generate_password_hash(password)

        def check_password(self, password):
            return check_password_hash(self.pwdhash, password)

3 个答案:

答案 0 :(得分:4)

您可以通过启动SQLite shell并使用.schema命令来检查数据库模式。

$ sqlite3 app.db
sqlite> .schema user

在某些时候,您的模型在nullable=False列上设置了role。您使用此模型创建了数据库,然后将其更改为True。在创建数据库后更改模型不会更改数据库,您需要迁移它。使用Alembic迁移SQLAlchemy数据库。

答案 1 :(得分:2)

当我将模型id定义为BIGINT时遇到了同样的问题,但我的测试代码使用sqlite作为测试数据库,当我更改模型定义时,问题解决了。

答案 2 :(得分:-2)

在flask项目中,如果U使用sqlite数据库,如果模型中的id设置为BIGINT,则在执行db.session.commit()UNIQUE constraint failed: tablename.column_name时将发生错误。

然后您可以通过以下方法解决它:

删除数据库中的表,添加属性AUTOINCREMENT,然后重新创建该表并加以解决:

CREATE TABLE table_name (
   id   BIGINT  PRIMARY KEY AUTOINCREMENT  NOT NULL,`
   ...