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
相关产品推荐
相关产品推荐

