Flask+MySQL项目遇UnboundLocalError错误求解决方法
解决UnboundLocalError: local variable 'cursor' referenced before assignment问题
错误原因
这个错误的核心是代码中存在某条执行路径,cursor变量还没被赋值就被调用。最常见的场景是:数据库连接失败(比如参数错误、MySQL服务未启动)时,cursor = conn.cursor()这行代码根本没执行,但后续代码依然尝试调用cursor的方法(比如cursor.execute()、cursor.close())。
修复方案
1. 确保cursor在所有路径下都被初始化
先检查你的数据库操作代码,比如这种典型的错误写法:
def get_user(): try: conn = mysql.connect() cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE id=1") return cursor.fetchone() except Exception as e: print(e) finally: cursor.close() # 连接失败时cursor未定义,直接报错 conn.close()
修复方式:在try块外先把cursor和conn初始化为None,在finally里判断非空再执行关闭操作:
def get_user(): conn = None cursor = None try: conn = mysql.connect( host="localhost", user="your_user", password="your_pwd", db="your_db" ) cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE id=1") return cursor.fetchone() except Exception as e: print(f"操作出错: {e}") return None finally: if cursor is not None: cursor.close() if conn is not None: conn.close()
2. 提前拦截无效连接
把数据库连接逻辑抽成单独函数,连接失败时直接返回None,上层代码先判断连接有效性再创建cursor:
def get_db_conn(): try: return mysql.connect( host="localhost", user="your_user", password="your_pwd", db="your_db" ) except Exception as e: print(f"连接失败: {e}") return None def get_user(): conn = get_db_conn() if not conn: return None cursor = None try: cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE id=1") return cursor.fetchone() except Exception as e: print(f"查询出错: {e}") return None finally: if cursor: cursor.close() conn.close()
3. 快速调试技巧
- 在
cursor = conn.cursor()前后加打印语句,确认这行代码是否被执行:
print("准备创建cursor") cursor = conn.cursor() print("cursor创建完成")
- 查看完整的异常栈信息,定位到具体哪一行引用了未赋值的
cursor,精准锁定问题代码段。
内容的提问来源于stack exchange,提问作者Ketan Bhole
相关产品推荐
相关产品推荐

