MySQL mysql.connector.cursor中weakref的用途

时间:2014-09-13 14:15:40

标签: python mysql

通过使用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来引用光标的连接?

感谢。

1 个答案:

答案 0 :(得分:2)

如果您查看项目的修订历史记录,the commit that introduces the use of weakref只是说:

  
      
  • 现在大多数对象使用弱引用:没有错误或泄漏,这表明我们需要这样做。可以敬畏。
  •   

因此,这似乎只是一个预防性的决定,以避免潜在的错误或泄漏,而不是针对特定问题的变更。