首页 » 网站建设 » phpfetchfetchall技巧_MySQL里fetchone和fetchall有差异吗爱可生

phpfetchfetchall技巧_MySQL里fetchone和fetchall有差异吗爱可生

访客 2024-12-01 0

扫一扫用手机浏览

文章目录 [+]

导读:

本日开拓问了我一个问题,大概问题是php程序实行了一条SQL,然后fetchone去取跟fetchall去取有什么差异吗?

phpfetchfetchall技巧_MySQL里fetchone和fetchall有差异吗爱可生

首先,他认为mysql实行一条SQL,并且把结果都存储在了MySQL的内存某个区域中了。
其次,他认为去fetch的时候是从MySQL这个内存区域中去获取数据,无非便是fetchone是单条单条去获取,fetchall是将数据全部过去到。
实验:

这个问题我之前也迷惑过,由于之前也写了很多的python脚本用来获取MySQL数据,但是基本上都是按套路写下来,也没有去穷究这个数据获取是怎么操作的。
那带着这个问题,我首先看了pymysql里面的cursor类,关于execute、fetchone和fetchall定义如下:

phpfetchfetchall技巧_MySQL里fetchone和fetchall有差异吗爱可生
(图片来自网络侵删)

#调用self._query方法进行查询def execute(self, query, args=None): """Execute a query :param str query: Query to execute. :param args: parameters used with query. (optional) :type args: tuple, list or dict :return: Number of affected rows :rtype: int If args is a list or tuple, %s can be used as a placeholder in the query. If args is a dict, %(name)s can be used as a placeholder in the query. """ while self.nextset(): pass query = self.mogrify(query, args) result = self._query(query) self._executed = query return result#调用_do_get_result获取查询结果def _query(self, q): conn = self._get_db() self._last_executed = q self._clear_result() conn.query(q) self._do_get_result() return self.rowcount#这里获取结果def _do_get_result(self): conn = self._get_db() self._result = result = conn._result self.rowcount = result.affected_rows self.description = result.description self.lastrowid = result.insert_id self._rows = result.rows self._warnings_handled = False if not self._defer_warnings: self._show_warnings()

实在看到这里代码逻辑已经很清楚了,在调用cursor.execute实行SQL的时候,就将MySQL查询的结果放到result这个变量里了,也便是说结果集放到了客户真个内存变量里,那么获取数据的办法也便是从这个内存变量里去获取数据,只是获取的行为有所不同而已了。

def fetchone(self): """Fetch the next row""" self._check_executed() if self._rows is None or self.rownumber >= len(self._rows): return None result = self._rows[self.rownumber] self.rownumber += 1 return resultdef fetchmany(self, size=None): """Fetch several rows""" self._check_executed() if self._rows is None: return () end = self.rownumber + (size or self.arraysize) result = self._rows[self.rownumber:end] self.rownumber = min(end, len(self._rows)) return resultdef fetchall(self): """Fetch all the rows""" self._check_executed() if self._rows is None: return () if self.rownumber: result = self._rows[self.rownumber:] else: result = self._rows self.rownumber = len(self._rows) return result

口说无凭,我们直接通过Wireshark抓包来证明一下,首先我在本地实行脚本如下,然后我监听本地的网卡流量

import pymysqlconn = pymysql.connect(host='xxx', port=3306, user='xucl', password='xuclxucl', database='xucl')cursor = conn.cursor()cursor.execute("select from t")

把稳,我这里并没有实行fetch操作,如果监听到的包里面包含了却果,那么就证明我们前面的剖析是精确的,话不多说开始实验,Wireshark抓包如下:

果真跟我们之前的预测是同等的,纵然没有进行fetch操作,MySQL也将结果集发送到客户端了。
其余关于结果集发送,可以参考我其余一篇文章:《由一个抓瞎的SQL引申出去》

结论:客户端实行SQL的时候,MySQL一次性将结果集发送给了客户端客户端接管到结果集往后存储本地内存变量中fetch结果只是从这个本地变量中获取,fetchone/fetchmany/fetchall只是获取行为的不同,因此对付MySQL来说并没有什么不同

关于爱可生

爱可天生立于2003年,依托于领悟、开放、创新的数据处理技能和做事能力,为大型行业用户的特定场景供应深度挖掘数据代价的办理方案。

公司持续积累的核心关键技能,覆盖到分布式数据库集群、云数据平台、数据库大体量运管平台、海量数据集成于存储、洗濯与管理、人工智能剖析挖掘、可视化展现、安全与隐私保护等多个领域。

公司已与多个行业内的专业公司建立了长期伙伴关系,不断促进新技能与行业知识相结合,为用户寻求新的数据驱动的代价增长点。
公司已在金融、能源电力、广电、政府等行业取得了浩瀚大型用户范例成功案例,得到了市场的认可和业务的持续增长。

标签:

相关文章

初探网页编程,入门指南与未来展望

网页编程已成为当今社会不可或缺的一部分。从简单的个人博客到复杂的电商平台,网页编程无处不在。对于初学者而言,掌握网页编程技能,不仅...

网站建设 2025-03-22 阅读0 评论0

包打听SEO,介绍搜索引擎优化之路

搜索引擎优化(SEO)已经成为企业提高网站排名、获取流量、提升品牌知名度的重要手段。SEO行业鱼龙混杂,各种优化方法层出不穷。本文...

网站建设 2025-03-22 阅读1 评论0

块编程,引领网页开发新潮流

网页开发领域也日新月异。从传统的HTML、CSS、JavaScript到如今的前端框架、库和工具,开发者们不断追求高效、便捷的编程...

网站建设 2025-03-22 阅读0 评论0