什么是mysql缓冲游标w.r.t python mysql连接器

有人能举个例子来理解这一点吗

执行查询后,MySQLCursorBuffered游标从服务器获取整个结果集并缓冲行。
对于使用缓冲游标执行的查询,诸如fetchone()之类的行提取方法会从缓冲行集中返回行。对于非缓冲游标,在调用行获取方法之前,不会从服务器获取行。在这种情况下,必须确保在同一连接上执行任何其他语句之前获取结果集的所有行,否则将引发InternalError(未读结果发现)异常

谢谢

我可以想出两种方法,这两种类型的光标s是不同的

第一种方法是,如果使用缓冲游标执行查询,可以通过检查MySQLCursorBuffered.rowcount获得返回的行数。但是,无缓冲游标的rowcount属性在调用execute方法之后立即返回-1。这基本上意味着尚未从服务器获取整个结果集。此外,无缓冲游标的rowcount属性在从中提取行时增加,而缓冲游标的rowcount属性在从中提取行时保持不变

以下代码片段试图说明上述要点:

导入mysql.connector
conn=mysql.connector.connect(database=’db’,
user=’username’,
密码=’pass’,
host=’localhost’,
端口=3306)
缓冲光标=连接光标(缓冲=真)
无缓冲游标=连接游标(缓冲=假)
创建“查询=”&引用&引用;
如果有人,放下桌子;
如果不存在人员,则创建表(
personid int(10)无符号自动增量,
名字叫瓦查尔(255),
姓氏varchar(255),
主键(personid)
);
插入人物(名字、姓氏)
价值观(“Jon”、“Bon Jovi”),
(“大卫”、“布莱恩”),
(“提科”、“托雷斯”),
(’Phil’,’Xenidis’),
(“休”、“麦当劳”)
&引用&引用&引用;
#创建并填充表
结果=缓冲\u游标。执行(创建\u查询,multi=True)
康涅狄格州提交
缓冲游标。执行(“从人中选择*”)
打印(“缓冲区游标的行计数:”,缓冲区游标。行计数)
无缓冲游标。执行(“从人中选择*”)
打印(“来自无缓冲游标的行计数:”,无缓冲游标.rowcount)
打印()
打印(“从缓冲光标提取行:”)
尽管如此:
尝试:
行=下一行(缓冲\u光标)
打印(“行:”,第行)
打印(行计数,缓冲游标。行计数)
除停止迭代外:
打破
打印()
打印(“从无缓冲光标提取行:”)
尽管如此:
尝试:
行=下一行(无缓冲\u光标)
打印(“行:”,第行)
打印(行计数,无缓冲游标。行计数)
除停止迭代外:
打破

上述代码段应返回如下内容:

缓冲读取器的行计数:5
来自非缓冲读取器的行计数:-1
从缓冲游标获取行:
行:(1,‘乔恩’、‘邦乔维’)
行数:5
世界其他地区:(2,‘大卫’、‘布莱恩’)
行数:5
世界其他地区:(3,‘提科’、‘托雷斯’)
行数:5
行:(4,‘菲尔’、‘塞尼迪斯’)
行数:5
第5排:(休、麦当劳)
世界其他地区:5
从未缓冲的游标获取行:
行:(1,‘乔恩’、‘邦乔维’)
行数:1
世界其他地区:(2,‘大卫’、‘布莱恩’)
行数:2
世界其他地区:(3,‘提科’、‘托雷斯’)
行数:3
行:(4,‘菲尔’、‘塞尼迪斯’)
行数:4
第5排:(休、麦当劳)
行数:5

如您所见,无缓冲光标的rowcount属性从-1开始,并随着循环遍历它生成的结果而增加。缓冲光标的情况并非如此

第二种区别的方法是注意两种方法中的哪一种(在同一连接下)executes。如果您开始执行一个未完全提取行的非缓冲游标,然后尝试使用缓冲游标执行查询,将引发内部错误异常,并要求您使用或放弃非缓冲游标返回的内容。下面是一个例子:

导入mysql.connector
conn=mysql.connector.connect(database=’db’,
user=’username’,
密码=’pass’,
host=’localhost’,
端口=3306)
缓冲光标=连接光标(缓冲=真)
无缓冲游标=连接游标(缓冲=假)
创建“查询=”&引用&引用;
如果有人,放下桌子;
如果不存在人员,则创建表(
personid int(10)无符号自动增量,
名字叫瓦查尔(255),
姓氏varchar(255),
主键(personid)
);
插入人物(名字、姓氏)
价值观(“Jon”、“Bon Jovi”),
(“大卫”、“布莱恩”),
(“提科”、“托雷斯”),
(’Phil’,’Xenidis’),
(“休”、“麦当劳”)
&引用&引用&引用;
#创建并填充表
结果=缓冲\u游标。执行(创建\u查询,multi=True)
康涅狄格州提交
无缓冲游标。执行(“从人中选择*”)
无缓冲游标。fetchone()
缓冲游标。执行(“从人中选择*”)

上面的代码段将引发一个内部错误异常,并显示一条消息,指示存在一些未读结果。它的基本意思是,在使用同一连接下的任何游标执行另一个查询之前,需要完全使用无缓冲游标返回的结果。如果将unbuffered\u cursor.fetchone()更改为unbuffered\u cursor.fetchall(),则错误将消失

还有其他不太明显的区别,比如内存消耗。缓冲游标可能会消耗更多内存,因为它们可能从服务器获取结果集并缓冲行

我希望这证明是有用的

发表评论