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

Flask框架无法向MySQL插入数据问题排查与解决求助

问题排查与解决:Flask表单提交MySQL无插入无报错

核心问题分析

  • 未指定目标数据库:MySQL连接配置缺少database参数,仅连接到MySQL服务但未选择具体数据库,导致插入语句无法定位employ表。
  • 表单数据获取方式错误:误用cgi.FieldStorage()处理Flask请求,正确方式应为request.form,原代码中input始终为空,插入逻辑从未执行。
  • 连接资源管理不当:全局数据库连接在首次请求后被关闭,后续请求会失效;未添加异常捕获,无法暴露执行错误。

修正后的代码实现

HTML表单(无需修改)

<form class="user" style="margin:auto; background-color:white;border:3px #2d2e33 dashed;" method="POST" action="{{ url_for('addnew') }}">
    <div style="text-align: center"> <h3>新增人員</h3></div>
        <div class="col-sm-6 mb-3 mb-sm-0" style="">
            <div class="col-sm-6 mb-3 mb-sm-0">
                <h4>編號:<input required type="text"  class="form-control form-control-user" name="emplo_num" style="width:500px;height:10px" /></h4>
            </div>
            <div>
                <h4>姓名:<input required type="text" class="form-control form-control-user" name="emplo_nam"  style="width:500px;height:10px" /></h4>
            </div>
            <div class="col-sm-6 mb-3 mb-sm-0">
                <h4 >信箱:<input required type="text" class="form-control form-control-user" name="emplo_email" style="width:500px;height:10px"/ ></h4>
            </div>
            <div class="col-sm-6 mb-3 mb-sm-0">
                <h4 >密碼:<input required type="text"  class="form-control form-control-user" name="emplo_pass" style="width:500px;height:10px"/></h4>
            </div>
            <div class="col-sm-6 mb-3 mb-sm-0">
                <h4 >部門:<input required type="text" class="form-control form-control-user" name="emplo_dep" style="width:500px;height:10px" /></h4>
            </div>
            <div class="col-sm-6 mb-3 mb-sm-0">
                <h4 >權限:<input required type="text"  class="form-control form-control-user" name="emplo_auth" style="width:500px;height:10px" /></h4>
            </div>
            <div  class="form-group" style="text-align:center">
                <input type="submit" value="Submit" class="fa-solid fa-user-plus" style="color :white;border:white;border-radius: 10px 10px 10px 10px;background-color:#0D2440;width:80px;height:26px" >
            </div>
        </div>
</form>

Flask后端代码(修正版)

from flask import Flask, render_template, request
import mysql.connector
from mysql.connector import Error
from flask_session import Session
from datetime import timedelta

app = Flask(__name__)

# Session配置
app.config['SESSION_TYPE'] = 'filesystem'
app.config['SESSION_PERMANENT'] = True
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=1)
Session(app)

def create_db_connection():
    """创建数据库连接"""
    connection = None
    try:
        connection = mysql.connector.connect(
            host='localhost',
            user='root',
            password='888888',
            port='3307',
            database='你的数据库名称'  # 替换为实际数据库名
        )
        if connection.is_connected():
            print("成功连接到MySQL数据库")
    except Error as e:
        print(f"连接错误: {e}")
    return connection

@app.route('/addnew.html', methods=['GET','POST'])
def addnew():
    if request.method == 'POST':
        # 从表单获取数据
        emplo_num = request.form.get('emplo_num')
        emplo_nam = request.form.get('emplo_nam')
        emplo_email = request.form.get('emplo_email')
        emplo_pass = request.form.get('emplo_pass')
        emplo_dep = request.form.get('emplo_dep')
        emplo_auth = request.form.get('emplo_auth')

        # 插入数据库
        conn = create_db_connection()
        if conn:
            try:
                cursor = conn.cursor()
                insert_query = """
                    INSERT INTO employ(emplo_num, emplo_nam, emplo_email, emplo_pass, emplo_dep, emplo_auth)
                    VALUES(%s, %s, %s, %s, %s, %s)
                """
                cursor.execute(insert_query, (emplo_num, emplo_nam, emplo_email, emplo_pass, emplo_dep, emplo_auth))
                conn.commit()
                print(f"成功插入{cursor.rowcount}条数据")
            except Error as e:
                print(f"插入错误: {e}")
                conn.rollback()  # 出错回滚
            finally:
                if cursor:
                    cursor.close()
                if conn.is_connected():
                    conn.close()

    return render_template('addnew.html')

if __name__ == '__main__':
    app.run(debug=True)  # 开启调试模式,方便查看错误

关键优化说明

  • 指定数据库:在create_db_connection中添加database参数,替换为你的实际数据库名称。
  • 正确获取表单数据:使用request.form.get()获取POST提交的表单字段。
  • 连接封装与异常处理:将连接逻辑封装为函数,添加异常捕获与回滚机制,避免数据不一致。
  • 调试模式:开启debug=True,提交错误时会在控制台显示详细报错信息。

额外安全建议

  • 密码加密存储:不要明文存储密码,使用werkzeug.security.generate_password_hash()对密码加密后再存入数据库:
    from werkzeug.security import generate_password_hash
    hashed_pass = generate_password_hash(emplo_pass)
    
  • 使用连接池:频繁创建关闭连接影响性能,可使用mysql.connector.pooling实现连接池。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 00:58:11