跟老齐学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返回昨天日期的方法
May 13 Python
简单掌握Python中glob模块查找文件路径的用法
Jul 05 Python
Python处理Excel文件实例代码
Jun 20 Python
对pandas的算术运算和数据对齐实例详解
Dec 22 Python
详解【python】str与json类型转换
Apr 29 Python
python实现海螺图片的方法示例
May 12 Python
python2和python3在处理字符串上的区别详解
May 29 Python
30秒学会30个超实用Python代码片段【收藏版】
Oct 15 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
详解Python内置模块Collections
Mar 22 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
探讨如何把session存入数据库
2013/06/07 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
PHP读取mssql json数据中文乱码的解决办法
2016/04/11 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
jquery模拟按下回车实现代码
2011/09/20 Javascript
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
js实现简单的碰壁反弹效果
2016/08/30 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
详解在vue-cli项目中安装node-sass
2017/06/21 Javascript
浅谈angular.js跨域post解决方案
2017/08/30 Javascript
微信小程序显示下拉列表功能【附源码下载】
2017/12/12 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
webpack css加载和图片加载的方法示例
2018/09/11 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
VSCode使用之Vue工程配置eslint
2019/04/30 Javascript
vue实现短信验证码登录功能(流程详解)
2019/12/10 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
Python实现简单的可逆加密程序实例
2015/03/05 Python
浅谈Python中数据解析
2015/05/05 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
PyQt5实现简易电子词典
2019/06/25 Python
Django REST 异常处理详解
2020/07/15 Python
Skip Hop官网:好莱坞宝宝挚爱品牌
2018/06/17 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
员工考核评语大全
2014/04/26 职场文书
会计岗位说明书
2014/07/29 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
教你如何用Python实现人脸识别(含源代码)
2021/06/23 Python