You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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模块返回的报错,我希望不使用额外库修复该问题。
开启app.run(debug=True)后的报错信息


问题原因及修复方案

问题出在你自定义的Mydtb模型的__init__构造方法赋值逻辑完全写反:你把还未赋值的实例属性self.user、self.password的值赋给了传入的参数变量,没有完成实例属性的赋值,最终创建的record实例没有合法的user和password值,触发数据库非空字段约束导致写入失败。

两种修复方式任选其一即可,无需引入额外依赖:

  1. 修正构造方法的赋值顺序
def __init__(self, user, password):
    self.user = user
    self.password = password
  1. 直接删除自定义的__init__方法:db.Model默认已经提供了适配字段参数的构造方法,不需要自己额外实现。

修复后重启服务即可正常写入表单数据。

内容的提问来源于stack exchange,提问作者Alfha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:09:02