Python 操作 MySQL 的一点儿补充

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/85881963

写在之前

在前面的文章中我写了关于 Python 操作 MySQL 数据库的文章(如下):

Python 操作 MySQL 数据库

主要讲了如何简单的使用 MySQL 以及如何用 Python 来操作 MySQL 数据库,基本的操作数据库无非就是增删改查这几个方面,Python 操作数据库的基本操作也是这几个。

因为内容较多,所以昨天的文章中在「查询」那部分有几个知识点没有写,后来想了想觉的这几个点也比较重要,本着写就写到底的“精神”,所以今天把它们单独拿出来写一下。往下看之前,建议先去看看昨天的文章。

Python 操作 MySQL 之查询

我在昨天的文章中说过,Python 是通过游标执行 SQL 语句的,所以我们在建立连接以后,要利用连接对象得到游标对象,然后利用游标对象的方法对数据库进行操作,在这里我补充一下游标对象的常用方法:

在这里插入图片描述

下面我还是用昨天文章中的例子:

我们从数据库中查找数据,使用游标的方法 execute() 来操作:

>>> cur.execute("select * from users")
2

这说明从 users 表汇总查询出 2 条记录,但是这 2 条记录并没有显示出来,那么如何显示 Python 查询结果呢?这就需要用到游标对象的 fetchall()、fetchmany(size=None)、fetchone() 等方法:

>>> lines = cur.fetchall()
>>> for line in lines:
...     print(line)
...
(1, 'rocky', '123123', '[email protected]')
(2, 'mypython', '123123', '[email protected]')

这样就逐条显示出来了。如果我们只想查其中某一条的话,也是可以的。比如第 1 条:

>>> cur.execute("select * from users where id = 1")
1
>>> line_first = cur.fetchone() #只返回一条
>>> print(line_first)
(1, 'rocky', '123123', '[email protected]')

为了对上述过程深入了解,我们下面来做一个小的实验:

扫描二维码关注公众号,回复: 4803008 查看本文章
>>> cur.execute("select * from users")
2
>>> cur.fetchall()
((1, 'rocky', '123123', '[email protected]'), (2, 'mypython', '123123', '[email protected]'))

由 cur.execute() 从数据库查询出来的东西,被保存在了 cur 所能找到的某个地方。要找出这些被保存的东西,需要用 cur.fetchall()(或 fetchone() 等),并且找出来以后作为对象存在。从上述代码及其运行结果来看,返回值是一个元组对象,里面的每一个对象都是一个一个的元组。所以我们用 for 循环就可以一个一个的拿出来。

我们紧接着上面的操作,再打印一遍:

>>> cur.fetchall()
()

咦,竟然是空的,怎么回事?不是说作为对象已经存在于内存中了吗?难道只是一次有效的吗?不要着急,还记得文件那部分吗?我们在那也遇到过这样的问题呀。(忘了的回去再翻翻)

通过游标找出来的对象,在读取的时候有一个特点:就是那个游标会移动。在第一次操作了 cur.fetchall() 后,因为是将所有的都打印出来了,游标就从第一条移动到了最后一条,所以再执行 cur.fetchall() 的时候就空了,因为最后一条后面没东西了。有没有想起来,是不是和文件一个样。

我们下面继续来试验,检验一下上面说的正确与否:

>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.fetchone()
>>>

你看,我们重新运行了查询语句后,这次我们不再一次性全部打印出来,而是一次打印一条。从上面的结果中我们可以看到,游标果然是在一条一条的向下移动。

到这可能有人会想,既然操作存储在内存中的对象时游标会移动,那么能不能让游标向上移动?或者移动到指定的地方呢?可以的,这就是 scroll()。

>>> cur.scroll(1)
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.scroll(-2)
>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')

果然是可以移动游标的,不过请仔细观察,上面的方式是让游标相对于当前位置向上或者向下移动,括号内是正数表示向下,括号内是负数,表示向上。

其实还有一种方式可以实现「绝对移动」,而不是「相对」某位置移动,即增加一个参数 absolute。「绝对移动」的参照物是开始,即位置编号为 0 的第 1 条:

>>> cur.scroll(1,"absolute") # 回到第 2 条
>>> cur.fetchone()
(2, 'mypython', '123123', '[email protected]')
>>> cur.scroll(0,"absolute")
>>> cur.fetchone()
(1, 'rocky', '123123', '[email protected]')

这里需要注意的是绝对位置中的数字不能是负数。

写在之后

这个部分我用了很大的篇幅来写,虽然看到的只是 2 篇文章,但是基本上每篇都很长,本来想拆分一下再写的,后来还是决定就是这么写完,想看的人自然会看。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/85881963