Flask使用SQLAlchemy提交表单数据至SQLite数据库失败如何解决?
问题
我尝试将用户名和密码条目提交到数据库,使用的代码在项目中命名为application.py,具体如下:
代码
from flask import Flask, render_template, request, redirect from flask_sqlalchemy import SQLAlchemy from datetime import datetime application = Flask(__name__) application.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydtb.db' db = SQLAlchemy(application) class Mydtb(db.Model): id = db.Column(db.Integer, primary_key=True, autoincrement = True) user = db.Column(db.String(50), nullable = False) password = db.Column(db.String(20), nullable = False) created = db.Column(db.DateTime, default = datetime.utcnow) def __init__(self, user, password): user = self.user password = self.password @application.route('/', methods=['POST', 'GET']) def home(): title = 'Registration page' if request.method == 'POST': record = Mydtb(request.form['usrname'], request.form['pwd']) db.session.add(record) db.session.commit() return redirect('/') else: mydtb = Mydtb.query.order_by(Mydtb.created) return render_template('index.html', title=title, mydtb = mydtb) if __name__ == '__main__': application.run(debug = True)
我已经生成了.db文件,html表单也运行正常,但application.py无法将表单条目写入数据库。
您可以查看
debug模块返回的报错,我希望不使用额外库修复该问题。
问题原因及修复方案
问题出在你自定义的Mydtb模型的__init__构造方法赋值逻辑完全写反:你把还未赋值的实例属性self.user、self.password的值赋给了传入的参数变量,没有完成实例属性的赋值,最终创建的record实例没有合法的user和password值,触发数据库非空字段约束导致写入失败。
两种修复方式任选其一即可,无需引入额外依赖:
- 修正构造方法的赋值顺序
def __init__(self, user, password): self.user = user self.password = password
- 直接删除自定义的
__init__方法:db.Model默认已经提供了适配字段参数的构造方法,不需要自己额外实现。
修复后重启服务即可正常写入表单数据。
内容的提问来源于stack exchange,提问作者Alfha
相关产品推荐
相关产品推荐


