问题复现
出现 E ReferenceError: weakly-referenced object no longer exists 报错
self = <mysql.connector.cursor_cext.CMySQLCursor object at 0x11de2a7d0>
operation = '\n select id, `name`,occupation,skills \n from resume \n where id = %s \n '
params = (3,), multi = Falsedef execute(self,operation: StrOrBytes,params: ParamsSequenceOrDictType = (),multi: bool = False,) -> Optional[Generator[CMySQLCursor, None, None]]:"""Execute given statement using given parametersDeprecated: The multi argument is not needed and nextset() shouldbe used to handle multiple result sets."""if not operation:return Nonetry:
> if not self._connection or self._connection.is_closed():
E ReferenceError: weakly-referenced object no longer exists
分析原因
不能连续调用
cursor = connect_db().cursor()
解决方法
将连写拆开,形成 2 句语句
connection = connect_db()cursor = connection.cursor()
问题总结
ReferenceError: weakly-referenced object no longer exists 这个错误通常出现在使用弱引用(weak reference)的情况下。弱引用是一种对对象的引用,它不会增加对象的引用计数,这意味着当没有其他强引用指向该对象时,对象可以被垃圾回收器回收。这种引用方式常用于避免循环引用和内存泄漏问题。
当你尝试访问一个已经被垃圾回收的弱引用对象时,就会抛出这个错误。这通常发生在以下几种情况:
对象已经被垃圾回收:弱引用指向的对象如果没有其他强引用指向它,那么它可能会被垃圾回收器回收。如果此时你尝试通过弱引用访问该对象,就会得到这个错误。
代码中的逻辑错误:可能是因为代码中的逻辑错误导致在可能已经被回收的对象上执行了某些操作。
代理对象的使用:在使用弱引用的代理(proxy)时,如果代理所指向的对象已经被删除,再次访问代理对象会抛出这个错误。
为了解决这个问题,你可以采取以下措施:
检查弱引用对象的有效性:在访问弱引用对象之前,先检查它是否仍然有效。可以使用 weakref.ref 对象的 callable() 方法来检查弱引用对象的有效性。如果返回 True,则表示弱引用对象仍然有效。
使用强引用或深拷贝:如果需要确保弱引用对象在使用时仍然存在,可以使用强引用或深拷贝来防止被引用对象被垃圾回收。通过保持对被引用对象的强引用,可以避免触发 weakly-referenced object no longer exists 错误。