当我从函数返回它时,Python(2.7.3)以某种奇怪的方式违反了我的mysql-connector游标。第一个例子很好用…
cnx = connect() sql = "SELECT * FROM MyTable" cursor = cnx.cursor() cursor.execute(sql) row = cursor.fetchone()
但是,如果我返回游标并从外部尝试fetchone()(或fetchall()),则会引发异常。
def run_query(): cnx = connect() sql = "SELECT * FROM MyTable" cursor = cnx.cursor() cursor.execute(sql) return cursor mycursor = run_query() row = mycursor.fetchone()
扔…
File "/usr/lib/pymodules/python2.7/mysql/connector/cursor.py", line 533, in fetchone row = self._fetch_row() File "/usr/lib/pymodules/python2.7/mysql/connector/cursor.py", line 508, in _fetch_row (row, eof) = self.db().protocol.get_row() AttributeError: 'NoneType' object has no attribute 'protocol'
尽管“打印类型(mycursor)”将打印“ mysql.connector.cursor.MySQLCursor”,这是事实。
Python对从函数返回的对象执行哪种邪恶的骚扰?(请记住,它将对 在 模块 内 传递的游标执行此操作……因此,这不像从“ import mysql.connector”作用域传递出去的对象一样。)
我没有立即可用的MySQL,但是正如Preet Sangha所述,当您连接到函数内部的数据库并返回游标时,cnx变量在函数退出时会超出范围,因此数据库连接会关闭,并且游标引用的是已关闭数据库连接。
cnx
在您的顶部代码示例中情况并非如此,这可能解释了它为什么起作用以及为什么底部示例不起作用。