Python MySQL连接器在游标循环中执行第二条sql语句?

Python MySQL连接器在游标循环中执行第二条sql语句?,python,mysql,mysql-python,mysql-connector,Python,Mysql,Mysql Python,Mysql Connector,以下逻辑适用于mysqldb模块(请参阅),但我在cursor2.execute(sql)上的mysql.connector中遇到以下错误 “找到未读结果。” 我意识到我可以使用连接来组合这两个简单的sql语句,并且不需要第二个游标,但是我的实际示例更复杂,需要第二个sql语句 假设我需要执行两条单独的sql语句(1条用于循环,1条在循环中),那么mysql.connector模块应该如何执行 import datetime import mysql.connector db = mysql.

以下逻辑适用于mysqldb模块(请参阅),但我在cursor2.execute(sql)上的mysql.connector中遇到以下错误

“找到未读结果。”

我意识到我可以使用连接来组合这两个简单的sql语句,并且不需要第二个游标,但是我的实际示例更复杂,需要第二个sql语句

假设我需要执行两条单独的sql语句(1条用于循环,1条在循环中),那么mysql.connector模块应该如何执行

import datetime
import mysql.connector

db = mysql.connector.connect(user='alan', password='please', host='machine1', database='mydb')

cursor1 = db.cursor()
cursor2 = db.cursor()

sql = """
SELECT userid, 
       username,
       date
  FROM user
 WHERE date BETWEEN %s AND %s
"""

start_date = datetime.date(1999, 1, 1)
end_date   = datetime.date(2014, 12, 31)

cursor1.execute(sql, (start_date, end_date))

for (userid, username, date) in cursor1:

    sql = """
        select count(*)
        from request
        where assigned = '%s'
    """ % (userid)

    cursor2.execute(sql)
    requestcount = cursor2.fetchone()[0]

    print userid, requestcount

cursor2.close()
cursor1.close()
db.close()
此mysqldb版本工作正常:

import datetime
import MySQLdb 

db = MySQLdb.connect(user='alan', passwd='please', host='machine1', db='mydb')

cursor1 = db.cursor()
cursor2 = db.cursor()

sql = """
SELECT userid, 
       username,
       date
  FROM user
 WHERE date BETWEEN %s AND %s
"""

start_date = datetime.date(1999, 1, 1)
end_date   = datetime.date(2014, 12, 31)

cursor1.execute(sql, (start_date, end_date))

for (userid, username, date) in cursor1:

    sql = """
        select count(*)
        from request
        where assigned = '%s'
    """ % (userid)

    cursor2.execute(sql)
    requestcount = cursor2.fetchone()[0]

    print userid, requestcount

cursor2.close()
cursor1.close()
db.close()

默认情况下,MySQL连接器/Python是非缓冲的。这意味着数据不会自动获取,您需要“使用”所有行。(它与MySQLdb一起工作,因为默认情况下驱动程序是缓冲的。)

使用Connector/Python,对于用作迭代器的游标,必须使用设置为True的缓冲参数。在OP的问题中,这将是
cursor1

cursor1 = db.cursor(buffered=True)
cursor2 = db.cursor()

您还可以使用
buffered=True
作为连接参数,通过此连接缓冲来实例化所有游标缓冲。

谢谢Geert!默认情况下缓冲和非缓冲之间的权衡决定是什么?从用户的角度来看,模仿mysqldb?IMHO似乎更好,在获取大量数据时,默认情况下不缓冲更安全。当我知道只有很小的结果时,我打开缓冲。这在Connector/Python中不会改变。再次感谢Geert!我只是想了解。:)不幸的是,
buffered=True
不能与
prepared=True
组合--“ValueError:游标不可用,且具有给定条件:buffered,prepared”