Flask调用executemany向MySQL插入多行数据时报格式字符串参数不足错误
问题修复方案
根因说明
- 表单字段拼写错误:获取密码时的字段名写成了
passwprd[],正确应该是password[],会导致密码数据获取失败 - 数据结构不符合批量插入要求:你组装的
data = [names, emails, passwords]是三个独立的单字段列表,不是按行对齐的多行数据结构,循环调用executemany时,每次传入的value是只有名字/邮箱/密码的单字段列表,匹配不上SQL语句里的3个%s占位符,直接触发参数不足的报错 executemany用法错误:不需要循环调用,它本身就是用来批量执行SQL的接口,直接传入完整的多行数据列表即可
修复后完整代码
@app.route("/insert", methods=["POST", "GET"]) def insert(): cur = mysql.connection.cursor() if request.method == 'POST': names = request.form.getlist('name[]') emails = request.form.getlist('email[]') # 修复字段拼写错误 passwords = request.form.getlist('password[]') # 按行对齐组装批量插入数据,每个元素对应一行的name、email、password值 batch_insert_data = list(zip(names, emails, passwords)) # 单次调用executemany完成批量插入 cur.executemany('INSERT INTO users (name, email, password) VALUES (%s, %s, %s)', batch_insert_data) mysql.connection.commit() cur.close() flash('New record created successfully') return redirect('/')
优化建议
- 插入前可以先校验
names、emails、passwords三个列表的长度是否一致,避免三个数组长度不同时zip截断数据导致行数据错位 - 禁止明文存储密码,建议引入
bcrypt等加密工具对密码做哈希处理后再入库 - 建议增加数据库操作的异常捕获逻辑,插入失败时可以回滚事务,避免脏数据
内容的提问来源于stack exchange,提问作者Doc Saab
相关产品推荐
相关产品推荐

