写在之前
在前面几天我写了关于 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', 'leey@gmail.com')
(2, 'mypython', '123123', 'python@gmail.com')
这样就逐条显示出来了。如果我们只想查其中某一条的话,也是可以的。比如第 1 条:
>>> cur.execute("select * from users where id = 1")
1
>>> line_first = cur.fetchone() #只返回一条
>>> print(line_first)
(1, 'rocky', '123123', 'leey@gmail.com')
为了对上述过程深入了解,我们下面来做一个小的实验:
>>> cur.execute("select * from users")
2
>>> cur.fetchall()
((1, 'rocky', '123123', 'leey@gmail.com'), (2, 'mypython', '123123', 'python@gmail.com'))
由 cur.execute() 从数据库查询出来的东西,被保存在了 cur 所能找到的某个地方。要找出这些被保存的东西,需要用 cur.fetchall()(或 fetchone() 等),并且找出来以后作为对象存在。从上述代码及其运行结果来看,返回值是一个元组对象,里面的每一个对象都是一个一个的元组。所以我们用 for 循环就可以一个一个的拿出来。
我们紧接着上面的操作,再打印一遍:
>>> cur.fetchall()
()
咦,竟然是空的,怎么回事?不是说作为对象已经存在于内存中了吗?难道只是一次有效的吗?不要着急,还记得文件那部分吗?我们在那也遇到过这样的问题呀。(忘了的回去再翻翻)
通过游标找出来的对象,在读取的时候有一个特点:就是那个游标会移动。在第一次操作了 cur.fetchall() 后,因为是将所有的都打印出来了,游标就从第一条移动到了最后一条,所以再执行 cur.fetchall() 的时候就空了,因为最后一条后面没东西了。有没有想起来,是不是和文件一个样。
我们下面继续来试验,检验一下上面说的正确与否:
>>> cur.fetchone()
(1, 'rocky', '123123', 'leey@gmail.com')
>>> cur.fetchone()
(2, 'mypython', '123123', 'python@gmail.com')
>>> cur.fetchone()
>>>
你看,我们重新运行了查询语句后,这次我们不再一次性全部打印出来,而是一次打印一条。从上面的结果中我们可以看到,游标果然是在一条一条的向下移动。
到这可能有人会想,既然操作存储在内存中的对象时游标会移动,那么能不能让游标向上移动?或者移动到指定的地方呢?可以的,这就是 scroll()。
>>> cur.scroll(1)
>>> cur.fetchone()
(2, 'mypython', '123123', 'python@gmail.com')
>>> cur.scroll(-2)
>>> cur.fetchone()
(1, 'rocky', '123123', 'leey@gmail.com')
果然是可以移动游标的,不过请仔细观察,上面的方式是让游标相对于当前位置向上或者向下移动,括号内是正数表示向下,括号内是负数,表示向上。
其实还有一种方式可以实现「绝对移动」,而不是「相对」某位置移动,即增加一个参数 absolute。「绝对移动」的参照物是开始,即位置编号为 0 的第 1 条:
>>> cur.scroll(1,"absolute") # 回到第 2 条
>>> cur.fetchone()
(2, 'mypython', '123123', 'python@gmail.com')
>>> cur.scroll(0,"absolute")
>>> cur.fetchone()
(1, 'rocky', '123123', 'leey@gmail.com')
这里需要注意的是绝对位置中的数字不能是负数。
写在之后
这个部分我用了很大的篇幅来写,虽然看到的只是 3 篇文章,但是基本上每篇都很长,本来想拆分一下再写的,后来还是决定就是这么写完,想看的人自然会看。
如果你能坚持看到这的话,恭喜你又学到了新的东西,希望你能自己亲自动手实践一下,毕竟实践出真知,好记性不如敲代码。
如果你觉得本篇文章对你有帮助的话,欢迎点赞支持一下。
The end。