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
相关产品推荐
相关产品推荐

