Python 炼金术+;SQLite非空故障
我有一个简单的注册表,它将插入我的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
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)