pan*_*ish 14 python mysql mysql-connector mysql-python
以下逻辑适用于mysqldb模块(请参阅python mysqldb一个连接的多个游标),但我在cursor2.execute(sql)上使用mysql.connector收到以下错误
"发现未读结果."
我意识到我可以使用连接来组合这两个简单的sql语句,并避免需要第二个游标,但我的真实世界的例子更复杂,需要第二个sql语句.
假设我需要执行2个单独的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()
Run Code Online (Sandbox Code Playgroud)
这个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()
Run Code Online (Sandbox Code Playgroud)
gee*_*vdk 16
默认情况下,MySQL Connector/Python是非缓冲的.这意味着不会自动获取数据,您需要"消耗" 所有行.(它适用于MySQLdb,因为默认情况下该驱动程序是缓冲的.)
使用Connector/Python,您必须将buffered-argument设置为True,以用作迭代器.在OP的问题中,这将是cursor1:
cursor1 = db.cursor(buffered=True)
cursor2 = db.cursor()
Run Code Online (Sandbox Code Playgroud)
您还可以使用buffered=Trueas connection参数来通过此连接缓冲实例化所有游标缓冲.
| 归档时间: |
|
| 查看次数: |
12356 次 |
| 最近记录: |