Flask中HTML下拉框值存入MySQL遇TypeError错误求助
解决Flask中MySQL execute()参数错误的问题
嘿,这个错误我之前也踩过坑,咱们来一步步搞定它:
错误原因分析
你碰到的TypeError: execute() takes from 2 to 3 positional arguments but 5 were given,核心问题出在两个地方:
- SQL语句的占位符写错了:你把第三个字段的占位符写成了
[],这不符合MySQL参数化查询的语法,应该用%s。 - 参数传递方式错误:
cursor.execute()方法要求第二个参数是一个包含所有占位符对应值的序列(元组或列表),而你现在把name、email、requesttype作为三个单独的参数传进去了,导致参数数量超标。
另外还有一个小细节需要注意:你的HTML里下拉列表的name属性是RequestType,但Flask代码里用的是requesttype = userDetails.get('requesttype'),大小写不一致会导致无法正确获取下拉框的选中值,这个也要一并修正。
修正后的代码
1. Flask代码调整
把SQL语句的占位符修正,同时把参数打包成元组传递:
from flask import Flask, render_template, request, redirect from flask_mysqldb import MySQL app = Flask(__name__) # Configure db app.config['MYSQL_HOST'] = 'localhost' app.config['MYSQL_USER'] = 'root' # app.config['MYSQL_PASSWORD'] = 'P@$$w0rd' app.config['MYSQL_DB'] = 'flaskapp' mysql = MySQL(app) @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': # Fetch form data userDetails = request.form name = userDetails['name'] email = userDetails['email'] # 这里统一name属性的大小写,和HTML保持一致 requesttype = userDetails.get('RequestType') cur = mysql.connection.cursor() # 修正占位符,并用元组传递参数 cur.execute("INSERT INTO users(name, email, requesttype) VALUES(%s, %s, %s)", (name, email, requesttype)) mysql.connection.commit() cur.close() return 'Save is Successful' return render_template('index.html')
2. HTML代码调整(可选,如果你想保持name属性小写的话)
如果不想修改Flask里的字段名,也可以把HTML下拉列表的name改成小写:
<form method="POST" action="{{ url_for('index') }}"> Name <input type="text" name="name" /> <br> Email <input type="email" name="email" /> <br> RequestType <select id="RequestType" name = "requesttype" > <option selected value="1">New</option> <option value="0">Old</option> </select><br> <input type="Submit"> </form>
验证一下
现在重新运行Flask应用,填写表单并提交,应该就能正常把数据插入到MySQL数据库里啦!
内容的提问来源于stack exchange,提问作者kitees
相关产品推荐
相关产品推荐

