跟老齐学Python之使用Python查询更新数据库


Posted in Python onNovember 25, 2014

回顾一下已有的战果:(1)连接数据库;(2)建立指针;(3)通过指针插入记录;(4)提交将插入结果保存到数据库。在交互模式中,先温故,再知新。

>>> #导入模块

>>> import MySQLdb
>>> #连接数据库

>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",port=3036,charset="utf8")
>>> #建立指针

>>> cur = conn.cursor()
>>> #插入记录

>>> cur.execute("insert into users (username,password,email) values (%s,%s,%s)",("老齐","9988","qiwsir@gmail.com"))

1L
>>> #提交保存

>>> conn.commit()

如果看官跟我似的,有点强迫症,总是想我得看到数据中有了,才放芳心呀。那就在进入到数据库,看看。
mysql> select * from users;

    +----+----------+----------+------------------+

    | id | username | password | email            |

    +----+----------+----------+------------------+

    |  1 | qiwsir   | 123123   | qiwsir@gmail.com |

    |  2 | python   | 123456   | python@gmail.com |

    |  3 | google   | 111222   | g@gmail.com      |

    |  4 | facebook | 222333   | f@face.book      |

    |  5 | github   | 333444   | git@hub.com      |

    |  6 | docker   | 444555   | doc@ker.com      |

    |  7 | 老齐     | 9988     | qiwsir@gmail.com |

    +----+----------+----------+------------------+

    7 rows in set (0.00 sec)

刚才温故的时候,插入的那条记录也赫然在目。不过这里特别提醒看官,我在前面建立这个数据库和数据表的时候,就已经设定好了字符编码为utf8,所以,在现在看到的查询结果中,可以显示汉字。否则,就看到的是一堆你不懂的码子了。如果看官遇到,请不要慌张,只需要修改字符编码即可。怎么改?请google。网上很多。

温故结束,开始知新。

查询数据

在前面操作的基础上,如果要从数据库中查询数据,当然也可以用指针来操作了。

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

7L

这说明从users表汇总查询出来了7条记录。但是,这似乎有点不友好,告诉我7条记录查出来了,但是在哪里呢,看前面在'mysql>'下操作查询命令的时候,一下就把7条记录列出来了。怎么显示python在这里的查询结果呢?

原来,在指针实例中,还要用这样的方法,才能实现上述想法:

fetchall(self):接收全部的返回结果行.
fetchmany(size=None):接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.
fetchone():返回一条结果行.
scroll(value, mode='relative'):移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果mode='absolute',则表示从结果集的第一行移动value条.
按照这些规则,尝试:

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

7L

>>> lines = cur.fetchall()

到这里,还没有看到什么,其实已经将查询到的记录(把他们看做对象)赋值给变量lines了。如果要把它们显示出来,就要用到曾经学习过的循环语句了。

>>> for line in lines:

...     print line

... 

(1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')

(2L, u'python', u'123456', u'python@gmail.com')

(3L, u'google', u'111222', u'g@gmail.com')

(4L, u'facebook', u'222333', u'f@face.book')

(5L, u'github', u'333444', u'git@hub.com')

(6L, u'docker', u'444555', u'doc@ker.com')

(7L, u'\u8001\u9f50', u'9988', u'qiwsir@gmail.com')

很好。果然是逐条显示出来了。列位注意,第七条中的u'\u8001\u95f5',这里是汉字,只不过由于我的shell不能显示罢了,不必惊慌,不必搭理它。

只想查出第一条,可以吗?当然可以!看下面的:

>>> cur.execute("select * from users where id=1")

1L

>>> line_first = cur.fetchone()     #只返回一条

>>> print line_first

(1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')

为了对上述过程了解深入,做下面实验:

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

7L

>>> print cur.fetchall()

((1L, u'qiwsir', u'123123', u'qiwsir@gmail.com'), (2L, u'python', u'123456', u'python@gmail.com'), (3L, u'google', u'111222', u'g@gmail.com'), (4L, u'facebook', u'222333', u'f@face.book'), (5L, u'github', u'333444', u'git@hub.com'), (6L, u'docker', u'444555', u'doc@ker.com'), (7L, u'\u8001\u9f50', u'9988', u'qiwsir@gmail.com'))

原来,用cur.execute()从数据库查询出来的东西,被“保存在了cur所能找到的某个地方”,要找出这些被保存的东西,需要用cur.fetchall()(或者fechone等),并且找出来之后,做为对象存在。从上面的实验探讨发现,被保存的对象是一个tuple中,里面的每个元素,都是一个一个的tuple。因此,用for循环就可以一个一个拿出来了。

看官是否理解其内涵了?

接着看,还有神奇的呢。

接着上面的操作,再打印一遍

>>> print cur.fetchall()

()

晕了!怎么什么是空?不是说做为对象已经存在了内存中了吗?难道这个内存中的对象是一次有效吗?

不要着急。

通过指针找出来的对象,在读取的时候有一个特点,就是那个指针会移动。在第一次操作了print cur.fetchall()后,因为是将所有的都打印出来,指针就要从第一条移动到最后一条。当print结束之后,指针已经在最后一条的后面了。接下来如果再次打印,就空了,最后一条后面没有东西了。

下面还要实验,检验上面所说:

>>> cur.execute('select * from users')

7L

>>> print cur.fetchone() 

(1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')

>>> print cur.fetchone()

(2L, u'python', u'123456', u'python@gmail.com')

>>> print cur.fetchone()

(3L, u'google', u'111222', u'g@gmail.com')

这次我不一次全部打印出来了,而是一次打印一条,看官可以从结果中看出来,果然那个指针在一条一条向下移动呢。注意,我在这次实验中,是重新运行了查询语句。

那么,既然在操作存储在内存中的对象时候,指针会移动,能不能让指针向上移动,或者移动到指定位置呢?这就是那个scroll()

>>> cur.scroll(1)

>>> print cur.fetchone()

(5L, u'github', u'333444', u'git@hub.com')

>>> cur.scroll(-2)

>>> print cur.fetchone()

(4L, u'facebook', u'222333', u'f@face.book')

果然,这个函数能够移动指针,不过请仔细观察,上面的方式是让指针相对与当前位置向上或者向下移动。即:

cur.scroll(n),或者,cur.scroll(n,"relative"):意思是相对当前位置向上或者向下移动,n为正数,表示向下(向前),n为负数,表示向上(向后)

还有一种方式,可以实现“绝对”移动,不是“相对”移动:增加一个参数"absolute"

特别提醒看官注意的是,在python中,序列对象是的顺序是从0开始的。

>>> cur.scroll(2,"absolute")    #回到序号是2,但指向第三条

>>> print cur.fetchone()        #打印,果然是

(3L, u'google', u'111222', u'g@gmail.com')
>>> cur.scroll(1,"absolute")

>>> print cur.fetchone()

(2L, u'python', u'123456', u'python@gmail.com')
>>> cur.scroll(0,"absolute")    #回到序号是0,即指向tuple的第一条

>>> print cur.fetchone()

(1L, u'qiwsir', u'123123', u'qiwsir@gmail.com')

至此,已经熟悉了cur.fetchall()和cur.fetchone()以及cur.scroll()几个方法,还有另外一个,接这上边的操作,也就是指针在序号是1的位置,指向了tuple的第二条

>>> cur.fetchmany(3)

((2L, u'python', u'123456', u'python@gmail.com'), (3L, u'google', u'111222', u'g@gmail.com'), (4L, u'facebook', u'222333', u'f@face.book'))

上面这个操作,就是实现了从当前位置(指针指向tuple的序号为1的位置,即第二条记录)开始,含当前位置,向下列出3条记录。

读取数据,好像有点??卵健O赶缸聊ィ?故怯械览淼摹D憔醯媚兀?/p>

不过,python总是能够为我们着想的,它的指针提供了一个参数,可以实现将读取到的数据变成字典形式,这样就提供了另外一种读取方式了。

>>> cur = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)

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

7L

>>> cur.fetchall()

({'username': u'qiwsir', 'password': u'123123', 'id': 1L, 'email': u'qiwsir@gmail.com'}, {'username': u'mypython', 'password': u'123456', 'id': 2L, 'email': u'python@gmail.com'}, {'username': u'google', 'password': u'111222', 'id': 3L, 'email': u'g@gmail.com'}, {'username': u'facebook', 'password': u'222333', 'id': 4L, 'email': u'f@face.book'}, {'username': u'github', 'password': u'333444', 'id': 5L, 'email': u'git@hub.com'}, {'username': u'docker', 'password': u'444555', 'id': 6L, 'email': u'doc@ker.com'}, {'username': u'\u8001\u9f50', 'password': u'9988', 'id': 7L, 'email': u'qiwsir@gmail.com'})   

这样,在元组里面的元素就是一个一个字典。可以这样来操作这个对象:

>>> cur.scroll(0,"absolute")

>>> for line in cur.fetchall():

...     print line["username"]

... 

qiwsir

mypython

google

facebook

github

docker

老齐

根据字典对象的特点来读取了“键-值”。

更新数据

经过前面的操作,这个就比较简单了,不过需要提醒的是,如果更新完毕,和插入数据一样,都需要commit()来提交保存。

>>> cur.execute("update users set username=%s where id=2",("mypython"))

1L

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

1L

>>> cur.fetchone()

(2L, u'mypython', u'123456', u'python@gmail.com')

从操作中看出来了,已经将数据库中第二条的用户名修改为mypython了,用的就是update语句。

不过,要真的实现在数据库中更新,还要运行:

>>> conn.commit()

这就大事完吉了。

Python 相关文章推荐
Python数据结构之单链表详解
Sep 12 Python
Python实现按照指定要求逆序输出一个数字的方法
Apr 19 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
Python重新加载模块的实现方法
Oct 16 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
Python性能分析工具Profile使用实例
Nov 19 Python
python实现图像拼接功能
Mar 23 Python
django 模型字段设置默认值代码
Jul 15 Python
Python如何读取、写入JSON数据
Jul 28 Python
如何在python中判断变量的类型
Jul 29 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 Python
跟老齐学Python之使用Python操作数据库(1)
Nov 25 #Python
Python标准库os.path包、glob包使用实例
Nov 25 #Python
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 #Python
Python标准库之多进程(multiprocessing包)介绍
Nov 25 #Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 #Python
Python标准库之循环器(itertools)介绍
Nov 25 #Python
Python标准库之sqlite3使用实例
Nov 25 #Python
You might like
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
PHP函数实现从一个文本字符串中提取关键字的方法
2015/07/01 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
js charAt的使用示例
2014/02/18 Javascript
AngularJs根据访问的页面动态加载Controller的解决方案
2015/02/04 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
JS中闭包的经典用法小结(2则示例)
2016/12/28 Javascript
JQuery 进入页面默认给已赋值的复选框打钩
2017/03/23 jQuery
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
webpack实现热更新(实施同步刷新)
2017/07/28 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python实现SMTP邮件发送功能
2020/06/16 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
python代码中怎么换行
2020/06/17 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
诗狄娜化妆品官方网站:Stila Cosmetics
2016/12/21 全球购物
倩碧香港官方网站:Clinique香港
2017/11/13 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
后勤园长自我鉴定
2013/10/17 职场文书
网络研修随笔感言
2014/02/17 职场文书
2015年元旦标语大全
2014/12/09 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
Python 统计序列中元素的出现频度
2022/04/26 Python