Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术+;SQLite非空故障_Python_Sqlite_Flask_Flask Sqlalchemy - Fatal编程技术网

Python 炼金术+;SQLite非空故障

Python 炼金术+;SQLite非空故障,python,sqlite,flask,flask-sqlalchemy,Python,Sqlite,Flask,Flask Sqlalchemy,我有一个简单的注册表,它将插入我的SQLite数据库。但是它失败了,因为它显示email列与notnull约束相矛盾。即使来自电子邮件的输入正在提交和识别 数据库模型(炼金术): class Registration(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement=True) email = db.Column(db.String(50)) username = db.Column

我有一个简单的注册表,它将插入我的SQLite数据库。但是它失败了,因为它显示
email
列与
notnull
约束相矛盾。即使来自
电子邮件的输入正在提交和识别

数据库模型(炼金术):

class Registration(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(50))
    username = db.Column(db.String(20))
    password = db.Column(db.String(350))
form = RegistrationForm()
    if request.method == "POST" and form.validate_on_submit():
        username = form.username.data
        email = form.email.data
        password = bcrypt.hashpw(form.password.data.encode('utf-8'), bcrypt.gensalt(14))

        # Query DB for existing username
        user = Registration.query.filter_by(username=username).first()
        # Query DB for existing email
        email = Registration.query.filter_by(email=email).first()

        # If username exits
        if user:
            flash("Sorry that username is already taken, please choose another!")
            return render_template('register.html', form=form)

        # If email exists
        elif email:
            flash('That email is already associated with another account, please use another!')
            return render_template('register.html', form=form)

        else:
            new_user = Registration(email=email, username=username, password=password)
            db.session.add(new_user)
            db.session.commit()
            flash("Thanks for registering, {u}!".format(u=username))

            return redirect(url_for('home'))
(sqlite3.IntegrityError) NOT NULL constraint failed: registration.email [SQL: 'INSERT INTO registration (email, username, password) VALUES (?, ?, ?)'] [parameters: (None, 'test_user', b'$2b$14$fiL14w35s.kckAY5timb9uE0d9pQ/K9RZpRuNPBlnsKl3FHaQfFoG')]
注册码:

class Registration(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(50))
    username = db.Column(db.String(20))
    password = db.Column(db.String(350))
form = RegistrationForm()
    if request.method == "POST" and form.validate_on_submit():
        username = form.username.data
        email = form.email.data
        password = bcrypt.hashpw(form.password.data.encode('utf-8'), bcrypt.gensalt(14))

        # Query DB for existing username
        user = Registration.query.filter_by(username=username).first()
        # Query DB for existing email
        email = Registration.query.filter_by(email=email).first()

        # If username exits
        if user:
            flash("Sorry that username is already taken, please choose another!")
            return render_template('register.html', form=form)

        # If email exists
        elif email:
            flash('That email is already associated with another account, please use another!')
            return render_template('register.html', form=form)

        else:
            new_user = Registration(email=email, username=username, password=password)
            db.session.add(new_user)
            db.session.commit()
            flash("Thanks for registering, {u}!".format(u=username))

            return redirect(url_for('home'))
(sqlite3.IntegrityError) NOT NULL constraint failed: registration.email [SQL: 'INSERT INTO registration (email, username, password) VALUES (?, ?, ?)'] [parameters: (None, 'test_user', b'$2b$14$fiL14w35s.kckAY5timb9uE0d9pQ/K9RZpRuNPBlnsKl3FHaQfFoG')]
错误:

class Registration(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(50))
    username = db.Column(db.String(20))
    password = db.Column(db.String(350))
form = RegistrationForm()
    if request.method == "POST" and form.validate_on_submit():
        username = form.username.data
        email = form.email.data
        password = bcrypt.hashpw(form.password.data.encode('utf-8'), bcrypt.gensalt(14))

        # Query DB for existing username
        user = Registration.query.filter_by(username=username).first()
        # Query DB for existing email
        email = Registration.query.filter_by(email=email).first()

        # If username exits
        if user:
            flash("Sorry that username is already taken, please choose another!")
            return render_template('register.html', form=form)

        # If email exists
        elif email:
            flash('That email is already associated with another account, please use another!')
            return render_template('register.html', form=form)

        else:
            new_user = Registration(email=email, username=username, password=password)
            db.session.add(new_user)
            db.session.commit()
            flash("Thanks for registering, {u}!".format(u=username))

            return redirect(url_for('home'))
(sqlite3.IntegrityError) NOT NULL constraint failed: registration.email [SQL: 'INSERT INTO registration (email, username, password) VALUES (?, ?, ?)'] [parameters: (None, 'test_user', b'$2b$14$fiL14w35s.kckAY5timb9uE0d9pQ/K9RZpRuNPBlnsKl3FHaQfFoG')]
但这表明找到了电子邮件地址:

2017-03-20 13:35:19,082 INFO sqlalchemy.engine.base.Engine ('insert@gmail.com', 1, 0)
但之后的两行是:

2017-03-20 13:35:19,084 INFO sqlalchemy.engine.base.Engine INSERT INTO registration (email, username, password) VALUES (?, ?, ?)
2017-03-20 13:35:19,084 INFO sqlalchemy.engine.base.Engine (None, 'test_user', b'$2b$14$fiL14w35s.kckAY5timb9uE0d9pQ/K9RZpRuNPBlnsKl3FHaQfFoG')

为什么它会尝试为
电子邮件插入
None
,即使它显示实际输入的电子邮件?

因为您运行此查询:

email=Registration.query.filter\u by(email=email.first()

您正在使用该查询的结果覆盖您的
电子邮件
变量。如果没有找到匹配的条目,您将用
None
替换
email
,这将导致您的问题

同样有趣的是,我不明白为什么你的
email
列有
notnull
约束-你对该列的定义是:

email=db.Column(db.String(50))

它不会为列指定任何约束。如果要确保此列从不为NULL,应将其更改为:

email=db.Column(db.String(50),nullable=False)