【问题标题】:NOT NULL constraint Failed in Flask + SQLite3NOT NULL 约束在 Flask + SQLite3 中失败
【发布时间】:2015-12-31 21:04:52
【问题描述】:

我的应用烧瓶中出现此错误

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

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

我的文件如下

这是我的models.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)

这是我的控制器.py

from flask import (
    Blueprint,
    request,
    render_template,
    flash,
    g,
    session,
    redirect,
    url_for
)
from werkzeug import check_password_hash, generate_password_hash

from app import db
from app.authentication.forms import LoginForm, SignupForm
from app.authentication.models import User

mod_auth = Blueprint('auth', __name__, url_prefix='/auth')

@mod_auth.route('/profile')
def profile():

    if 'email' not in session:
        return redirect(url_for('signin'))

    user = User.query.filter_by(email = session['email']).first()

    if user is None:
        return redirect(url_for('signin'))
    else:
        return render_template('authentication/profile.html')

@mod_auth.route('/signup/', methods=['GET', 'POST'])
def signup():

    form = SignupForm()

    if 'email' is session:
        return redirect(url_for('profile'))

    if request.method == 'POST':
        if form.validate() == False:
            return render_template("authentication/signup.html", form=form)
        else:
            new_user = User(form.username.data, form.email.data, form.password.data)
            db.session.add(new_user)
            db.session.commit()

            session['email'] = new_user.email
            return "Not found"

    elif request.method == 'GET':
        return render_template("authentication/signup.html", form=form)


@mod_auth.route('/signin/', methods=['GET', 'POST'])
def signin():

    form = LoginForm(request.form)
    if form.validate_on_submit():
        user = User.query.filter_by(email=form.email.data).first()
        if user and check_password_hash(user.password, form.password.data):
            session['user_id'] = user.id
            flash('Welcome %s' % user.name)
            return redirect(url_for('auth.home'))

        flash('Wrong email or password', 'error-message')

    return render_template("authentication/signin.html", form=form)

【问题讨论】:

    标签: python sqlite flask


    【解决方案1】:

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

    $ sqlite3 app.db
    sqlite> .schema user
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在flask项目中,如果U使用sqlite数据库,如果model中的id设置为BIGINT,dodb.session.commit()UNIQUE constraint failed: tablename.column_name时会报错。

        那么你可以通过以下方式解决:

        删除数据库中的表,添加属性AUTOINCREMENT,然后重新创建此表即可解决:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-10
          • 2021-08-07
          • 2021-07-02
          • 1970-01-01
          • 1970-01-01
          • 2016-04-07
          • 2015-04-22
          • 1970-01-01
          相关资源
          最近更新 更多