通过使用MySQL官方python驱动程序 mysql.connector ,以下代码段正常工作。
# -*- coding: utf-8 -*-
import mysql.connector
conn = mysql.connector.connect(...)
cursor = conn.cursor()
cursor.execute(...)
但是当我使用链式调用来创建游标时,
# -*- coding: utf-8 -*-
import mysql.connector
cursor = mysql.connector.connect(...).cursor()
cursor.execute(...)
我遇到异常: ReferenceError:弱引用的对象不再存在
这是由于在mysql.connector.cursor
源代码中使用了 weakref
def _set_connection(self, connection):
"""Set the connection"""
try:
self._connection = weakref.proxy(connection)
self._connection._protocol # pylint: disable=W0212,W0104
except (AttributeError, TypeError):
raise errors.InterfaceError(errno=2048)
weakref不会增加对临时连接对象的引用计数,因此在语句之后
mysql.connector.connect(...).cursor()
连接对象似乎是通过垃圾回收来回收的。
由于在mysql.connector.connection
源代码中,没有对游标对象的引用。
mysql.connector.cursor
中的弱参数可能未设置为解决循环引用问题。
有谁知道为什么要设置weakref来引用光标的连接?
感谢。
答案 0 :(得分:2)
如果您查看项目的修订历史记录,the commit that introduces the use of weakref
只是说:
- 现在大多数对象使用弱引用:没有错误或泄漏,这表明我们需要这样做。可以敬畏。
因此,这似乎只是一个预防性的决定,以避免潜在的错误或泄漏,而不是针对特定问题的变更。