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

2024-05-03 08:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

以下逻辑适用于mysqldb模块(请参见python mysqldb multiple cursors for one connection),但我在cursor2.execute(sql)上的mysql.connector中得到以下错误

“找到未读结果。”

我意识到我可以使用一个join来组合这两个简单的sql语句,从而避免需要第二个游标,但是我的实际例子更复杂,需要第二个sql语句。

假设我需要执行两个单独的sql语句(一个用于循环,一个在循环内),那么如何使用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()

Tags: importcloseexecutedbsqlconnectordatetimedate
1条回答
网友
1楼 · 发布于 2024-05-03 08:26:59

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

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

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

您还可以使用buffered=True作为连接参数,使所有游标缓冲都由该连接缓冲实例化。

相关问题 更多 >