Python SQLite3库值插值问题排查求助
SQLite参数化插入查询失败问题
问题场景
编写向users表插入用户数据的SQL语句时,直接硬编码值能正常执行,但使用SQLite参数化查询方式却失败,调试困难。
调试信息
通过调试语句获取表单参数处理后的值:
app.logger.debug(f'''{request.form.get("firstName").capitalize()}, {request.form.get("lastName").capitalize()}, {request.form.get("userName").lower()}, {request.form.get("inputEmail").lower()}, {generate_password_hash(request.form.get("inputPassword"), method="sha256")}''')
调试输出:
DEBUG: David, Taylor, taylord, dave@imagetaylor.com, sha256$xXfFJg6EKm9V7O5D$f8eadba22c3ad99c4133ac9ae4d2d25dfe9665b70df04d51417d1caec708ab4c
直接硬编码值执行正常
将上述值直接写入SQL语句,调用dbexe执行成功:
dbexe("INSERT INTO users(firstname,lastname,username,email,hash) VALUES('David','Taylor','taylord','dave@imagetaylor.com','sha256$04meQSacFSYL12aq$b17d53e8a3de54e0dcf66c11cf36858f551b9b72a771b18c9b8f3bf24599f8b2')")
参数化查询执行失败
使用SQLite参数化方式编写的查询执行失败:
dbexe("INSERT INTO users(firstname,lastname,username,email,hash) VALUES('?','?','?','?','?')", request.form.get("firstName").capitalize(), request.form.get("lastName").capitalize(), request.form.get("userName").lower(), request.form.get("inputEmail").lower(), generate_password_hash(request.form.get("inputPassword"), method="sha256"))
dbexe函数定义
def dbexe(query): try: retval = [] db = sqlite3.connect("main.db") db.row_factory = dict_factory for row in db.execute(query): retval.append(row) db.commit() db.close() except: return "Failed" return retval
问题原因及解决方案
- 参数占位符语法错误:SQLite的参数占位符
?不需要加单引号,加单引号会被识别为普通字符串字面量,而非参数占位符。正确的SQL语句应为:"INSERT INTO users(firstname,lastname,username,email,hash) VALUES(?,?,?,?,?)" - dbexe函数不支持接收参数:当前函数仅接受
query一个参数,无法传递参数化查询所需的参数值。需修改函数支持可变参数:def dbexe(query, *args): try: retval = [] db = sqlite3.connect("main.db") db.row_factory = dict_factory cursor = db.execute(query, args) for row in cursor: retval.append(row) db.commit() db.close() except Exception as e: print(f"数据库执行错误: {e}") return "Failed" return retval - 异常捕获无有效信息:原函数
except:捕获所有异常但不输出详情,无法定位错误。建议捕获Exception并打印异常信息,方便调试。
内容的提问来源于stack exchange,提问作者davetayl
相关产品推荐
相关产品推荐

