【我理解的Python】self.cur.scroll源码理解

总结我所理解的,整理过程的点点滴滴,只为回首往事时不因虚度年华而悔恨,不因碌碌无为而羞耻。

欢迎你来我的千聊平台,我们一起颠覆你的Python接口自动化测试

【目录】我所理解的Python

【问题】:为什么第二步要使用mode='absolute'使索引回到最初的位置呢?

self.cur.execute(condition)
self.cur.scroll(0,mode='absolute')# 游标索引回到初始位置
results =self.cur.fetchall()#返回游标中所有结果

【我的理解】:第二步是将游标回到原点,继而获取所有数据

1、我的数据库表数据是3条:


2、第一步是在游标下执行sql,那么执行的结果是先放在游标中的,这个没有异议;
3、第二步是在游标下执行.scroll方法,那么不清楚这一步具体是做啥的,我们看下Python源码是怎么解释的:


4、第三步在游标下执行fetchall()方法,同样我们看下Python源码是怎么解释的:


【更进一步】:设置游标位置

可以通过cursor.scroll(position, mode="relative | absolute")方法,来设置相对位置游标和绝对位置游标。
方法参数描述:
position : 游标位置(游标位置从0开始)
mode : 游标位置的模式(relative:默认模式,相对当前位置(即执行scroll方法时游标的位置);absolute:绝对位置)
例如:
mode=relative, position=1;表示的是设置游标为当前位置+1的位置,即向下移动一个位置
mode=absolute, position=2;将游标移动到索引为2的位置,无论当前位置在哪里

【样例解释】

#hrwang
#coding:utf-8
import MySQLdb
connection = MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db='test_interface', charset='utf8')
cursor = connection.cursor()
# 返回执行结果数
nums = cursor.execute("select * from test_xml")#self._rows=<type 'tuple'>: ((1L, u'test1'), (2L, u'weqwe'), (3L, u'weqw'))
print(nums)#执行结果影响的数据条数
'''
    fetchone()源码
    def fetchone(self):
        """Fetches a single row from the cursor. None indicates that
        no more rows are available."""
        self._check_executed()
        if self.rownumber >= len(self._rows): return None
        result = self._rows[self.rownumber]
        self.rownumber = self.rownumber+1
        return result
'''
print(cursor.fetchone())  # 执行后,游标移动到索引位置为1,即self.rownumber=1
cursor.scroll(1,mode='relative')  # 相对游标移动模式,当前索引+1,即游标位置为2
'''
    fetchall()源码
    def fetchall(self):
        """Fetchs all available rows from the cursor."""
        self._check_executed()
        if self.rownumber:
            result = self._rows[self.rownumber:]
        else:
            result = self._rows
        self.rownumber = len(self._rows)
        return result
'''
print(cursor.fetchall())  # 因此获取所有数据即result=self._rows[2:],即result等于数据库第三个数
'''
    fetchmany()源码
    def fetchmany(self, size=None):
        """Fetch up to size rows from the cursor. Result set may be smaller
        than size. If size is not defined, cursor.arraysize is used."""
        self._check_executed()
        end = self.rownumber + (size or self.arraysize)
        result = self._rows[self.rownumber:end]
        self.rownumber = min(end, len(self._rows))
        return result
'''
print(cursor.fetchmany(size=1))  # 执行该语句前,self.rownumber=3,故result=()
cursor.scroll(0, mode="absolute")  # 绝对索引模式,将游标重置为0
print(cursor.fetchall())  # 因此获取所有数据,执行开始的时候self.rownumber=0,故result=self._rows
#执行结果是:
3
(1L, u'test1')
((3L, u'weqw'),)
()
((1L, u'test1'), (2L, u'weqwe'), (3L, u'weqw'))

################################################
先说下更新的原因:
今天在查询数据库数据时(表中无数据),使用self.cur.scroll(0,mode='absolute')会提示“out of range”,细心的朋友看源码也知道原因了,但是我不能理解源码为什么要这么写,难道没有数据就不能使用这个方法了吗?最后我没有找到原因也没去修改源码,默默的加了条数据。


image.png

作者简介:
1、6年软件测试经验;2、擅长接口手工测试及自动化测试,UI自动化,Django 框架;3、自编自导自演了一套基于 Python + Django + MySQL 的自动化测试平台;

想更深入的了解,欢迎来我的千聊平台,我们一起颠覆你的Python接口自动化测试

【目录】我所理解的Python

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,680评论 1 92
  • python操作mysql,定义了一个查询多条数据的方法selectAll: 【问题】关于self.cur.scr...
    蒹葭苍苍蛋阅读 5,538评论 0 51
  • 第八章 数据查询和选择 ||| 第十章 获取GIS数据列表和描述信息 我们将在本章中介绍以下几个案例: 游标对象(...
    muyan阅读 21,503评论 5 21
  • 1. tab列表折叠效果 html: 能源系统事业部 岗位名称: 工作地点 岗位名...
    lilyping阅读 5,882评论 0 1
  • 本书介绍 你是不是对Django的学习感到迷茫?是不是对网上零星的教程感到绝望?是不是苦于没有可以迅速上手的实例而...
    阡陌3536阅读 5,104评论 0 0