You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将弱引用变量转为强引用?解决MySQL连接弱引用报错

报错原因

mysql-connector库中,游标对象默认持有数据库连接对象的弱引用。你当前的connect_db函数中,数据库连接对象cnx是函数内部的局部变量,函数执行完毕返回游标后,没有任何强引用指向cnx,Python垃圾回收机制会自动销毁这个连接对象,此时游标持有的弱引用就会失效,调用execute方法时就会抛出该错误。

解决方案

核心逻辑就是给连接对象cnx保留一个强引用,避免被提前回收,可选方案如下:

  • 方案1:修改返回值,同时返回连接和游标对象
    修改utils.py代码:
def connect_db():
    cnx = mysql.connector.connect(user="root", database="test_db")
    cursor = cnx.cursor()
    return cnx, cursor

对应修改main.py代码:

from utils import connect_db

def main():
    cnx, cursor = connect_db()
    cursor.execute("some commands")
    # 业务逻辑执行完后记得关闭连接和游标
    cursor.close()
    cnx.close()
  • 方案2:给游标对象附加连接的强引用
    如果不想修改现有返回值结构,可以直接把连接对象绑定为游标对象的属性,游标被强引用时,绑定的连接属性也不会被回收,仅修改utils.py即可:
def connect_db():
    cnx = mysql.connector.connect(user="root", database="test_db")
    cursor = cnx.cursor()
    # 给游标附加连接的强引用
    cursor.connection = cnx
    return cursor
  • 方案3:封装为数据库操作类持有连接
    如果是频繁操作数据库的场景,可以封装成工具类,把连接作为实例属性持有,天然保留强引用:
import mysql.connector

class DBHelper:
    def __init__(self, user="root", database="test_db"):
        self.cnx = mysql.connector.connect(user=user, database=database)
        self.cursor = self.cnx.cursor()
    
    def execute(self, sql, params=None):
        self.cursor.execute(sql, params or ())
        return self.cursor
    
    def close(self):
        self.cursor.close()
        self.cnx.close()

使用示例:

def main():
    db = DBHelper()
    db.execute("some commands")
    db.close()

内容的提问来源于stack exchange,提问作者user15256253

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:36:04