5

関数から返すと、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'

これは、「print type(mycursor)」が「mysql.connector.cursor.MySQLCursor」を出力するという事実にもかかわらずです。

関数から返されたオブジェクトに対して Python が行っているのは、どのような不浄な虐待ですか? (モジュール内で渡されたカーソルに対してこれを行うことに注意してください...したがって、「import mysql.connector」スコープから渡されたオブジェクトとは異なります...)

4

2 に答える 2

0

関数で type(connect) を出力できますか?

サンプル:

>>> import MySQLdb as mydb
>>> def runQuery(sql):
...     db = mydb.connect('localhost', 'testuser', 'test', 'test')
...     cur = db.cursor()
...     cur.execute(sql)
...     data = cur.fetchall()
...     print "Query :: %s"  %sql
...     print "Result:: %s" %data
...     return cur
...
>>>
>>> cursor = runQuery("SELECT VERSION()")
Query :: SELECT VERSION()
Result:: ('5.6.11-log',)
>>>
>>> cursor.execute("SELECT * FROM EMPLOYEES")
3L
>>> data = cursor.fetchall()
>>>
>>> print data
(('JOHN', 30L, 23000.0), ('SONY', 26L, 14000.0), ('SMITH', 53L, 123000.0))
>>>
>>>
于 2013-05-13T04:45:38.487 に答える