SQLite3.OperationalError报错:不存在stock_name列的技术咨询
解决方案:SQLite OperationalError(不存在stock_name列)
错误原因
你的process_user_input1函数中UPDATE语句存在两个关键问题:
SET BRstage=BRstage:SQL解析器会将等号两侧的BRstage都识别为表的列名,不会读取你定义的Python变量值WHERE stockName=stock_name:同样,SQL把stock_name误认为是表的列名,而非Python变量,因此触发“不存在stock_name列”的错误
修正后的代码
将UPDATE语句改为参数化查询,用?作为占位符,把变量值通过execute的第二个参数传入,既解决变量识别问题,还能避免SQL注入风险:
def process_user_input1(data): print("Process_user_input1 started") # 获取数据中的用户输入 stock_name = data.get('stockName') BRstage = data.get('BRstage') # 创建新连接和游标 conn = sqlite3.connect('C:/SQLite/pythonstock/database.db') c = conn.cursor() # 使用参数化查询,?是占位符,对应后面元组中的变量值 c.execute('UPDATE stocks SET BRstage = ? WHERE lower(stockName) = ?', (BRstage, stock_name.lower())) conn.commit() conn.close() processed_input1 = 'success' response = {'processed_input1': processed_input1} return response
额外优化建议
- 可以添加异常捕获与参数校验,避免无效输入或数据库错误导致的崩溃:
def process_user_input1(data): print("Process_user_input1 started") stock_name = data.get('stockName') BRstage = data.get('BRstage') # 校验必要参数是否存在 if not stock_name or BRstage is None: return {'processed_input1': 'error', 'msg': '缺少stockName或BRstage参数'} try: conn = sqlite3.connect('C:/SQLite/pythonstock/database.db') c = conn.cursor() c.execute('UPDATE stocks SET BRstage = ? WHERE lower(stockName) = ?', (BRstage, stock_name.lower())) conn.commit() # 检查是否有行被更新,避免输入不存在的股票时返回成功的误导 if c.rowcount == 0: return {'processed_input1': 'error', 'msg': '未找到对应股票'} return {'processed_input1': 'success'} except Exception as e: conn.rollback() # 出错时回滚事务 return {'processed_input1': 'error', 'msg': str(e)} finally: conn.close() # 确保数据库连接最终关闭
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

