工欲善其事,必先利其器。所以第一步,我们先下载第三方库。在这里,我用到的是pymysql库。

下载库:在命令行输入

1pip install pymysql

下载后可检验一下是否成功下载。直接在命令行进入python然后导库即可

1C:\Users\June>python

2Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32

3Type "help", "copyright", "credits" or "license" for more information.

4>>> import pymysql

5>>>

看到这个画面就说明下载成功了,接下来学习如何操作数据库了!!!

连接数据库

1import pymysql

2# 连接数据库

3db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')

以上的参数是必填的

host: 这个是ip地址,因为我这里是本地的,所以填127.0.0.1,也可以填localhost。

user:用户名,如果你也是本地的,就填root好了

passwd:这个是密码,填上你自己设的密码就可以了

db:这个是数据库名,我这里选的是news数据库

port:这个是端口,本地的一般都是3306

charset:这个是编码方式,要和你数据库的编码方式一致,要不会连接失败

连接上了,怎么验证呢?这里我们可以选择查一条数据

1try:

2 db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8')

3 # 检验数据库是否连接成功

4 cursor = db.cursor()

5 # 这个是执行sql语句,返回的是影响的条数

6 data = cursor.execute('SELECT * FROM `new`')

7 # 得到一条数据

8 one = cursor.fetchone()

9 print(data)

10 print(one)

11except pymysql.Error as e:

12 print(e)

13 print('操作数据库失败')

14finally:

15 # 如果连接成功就要关闭数据库

16 if db:

17 db.close()

代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 pymsql.Error里面。上面的代码看不懂也没关系,因为我接下来会说,如果运行后有结果证明连接成功。

在用完后,一定要记得关闭数据库连接,防止资源泄露问题。

对数据进行查询

1import pymysql

2try:

3 conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)

4 # 这个是光标,用来操作数据库语句

5 cursor = conn.cursor()

6 # 执行sql语句

7 cursor.execute('SELECT * FROM `new`')

8 print(cursor.fetchone())

9 # 关闭光标

10 cursor.close()

11except pymysql.Error as e:

12 print(e)

13 print('操作数据库失败')

14finally:

15 if conn:

16 conn.close()

代码解读:cursor():这个是光标,用来执行mysql语句的,用完后也是需要关闭的

excute():这个是执行语句,执行参数的mysql语句

fetchone():这个是查看执行语句后的一条数据

fetchall():这个是查看所有数据

在查询数据后,返回的是一整条数据,有没有可以按字典形式来查询的呢?来试试!

1print(cursor.fetchone()['name'])

2

3Traceback (most recent call last):

4 File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in

5 print(cursor.fetchone()['name'])

6TypeError: tuple indices must be integers or slices, not str

查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。

虽然python没有提供,但是我们可以手动转成字典来查询啊

cursor这里有个属性:description。获取的是数据库每个栏位情况,如下:

1print(cursor.description)

2# 下面是结果

3(('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False)

所以,我们利用这个属性手动生成字典

1# 将一条数据转成字典方便查找

2new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))

3print(new)

4# 下面是结果

5{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}

这里利用zip函数和列表生成式来一行代码就生成成功了

用字典来查询,现在就可以了

1print(new['title'])

2# 下面是结果

3考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福

但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到map函数了

1def new2dict(new):

2 return dict(zip([x[0] for x in cursor.description],[x for x in new]))

3news_list = list(map(new2dict,cursor.fetchall()))

4print(news_list)

5# 下面是结果

6[{'id': 2, 'type': 'NBA', 'title': '考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福', 'content': '他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击', 'view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author': 'xiaoylin', 'from': '腾讯体育', 'is_valibale': 1}, {'id': 3, 'type': 'NBA', 'title': '火箭挖21分大哈登得背锅 连遭浓眉大帽太尴尬', 'content': '火箭在客场以113-115惜败于鹈鹕,4连胜终结。詹姆斯-哈登出战34分钟16投5中,其中三分球9投只有1中,罚球14罚12中,拿到23分、11助攻、5篮板但也有4次失误,其在场正负值为尴尬的-12分', 'view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author': 'youngcao', 'from': '腾讯体育','is_valibale': 1}, {'id': 4, 'type': '英超', 'title': '足总杯-曼联4-0英乙球队晋级 桑神首秀造两球', 'content': '2017-18赛季英格兰足总杯第4轮,曼联客场4比0击败英乙球队约维尔,顺利晋级下一轮。桑切斯迎来曼联首秀,并制造了两个入球', 'view_count': 6560, 'release_time': datetime.datetime(2018, 1, 27, 5, 49), 'author': 'ricazhang', 'from': '腾讯体育','is_valibale': 1}, {'id': 5, 'type': '英超', 'title': '这才配红魔7号!桑神首秀大腿级表演 回击嘘声质疑', 'content': '在今天凌晨对阵约维尔的首秀也值得期待。虽然在登场的72分钟时间里没有进球,但送出1次助攻且有有6次威胁传球的数据还是十分亮眼', 'view_count': 2760, 'release_time': datetime.datetime(2018, 1, 27, 6, 13), 'author': 'yaxinhao', 'from': '腾讯体育', 'is_valibale': 1}]

这里很巧妙的利用了map函数,因为多条数据就可以进行迭代了,需要操作每条数据,这样就可以想到map函数

接下来我们再用面向对象的方法来用python进行查询数据库

1import pymysql

2class MysqlSearch(object):

3 def get_conn(self):

4 '''连接mysql数据库'''

5 try:

6 self.conn = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',port=3306,charset='utf8',db='news')

7 except pymysql.Error as e:

8 print(e)

9 print('连接数据库失败')

10

11 def close_conn(self):

12 '''关闭数据库'''

13 try:

14 if self.conn:

15 self.conn.close()

16 except pymysql.Error as e:

17 print(e)

18 print('关闭数据库失败')

19

20 def get_one(self):

21 '''查询一条数据'''

22 try:

23 # 这个是连接数据库

24 self.get_conn()

25 # 查询语句

26 sql = 'SELECT * FROM `new` WHERE `type`=%s'

27 # 这个光标用来执行sql语句

28 cursor = self.conn.cursor()

29 cursor.execute(sql,('英超',))

30 new = cursor.fetchone()

31 # 返回一个字典,让用户可以按数据类型来获取数据

32 new_dict = dict(zip([x[0] for x in cursor.description],new))

33 # 关闭cursor

34 cursor.close()

35 self.close_conn()

36 return new_dict

37 except AttributeError as e:

38 print(e)

39 return None

40 def get_all(self):

41 '''获取所有结果'''

42 sql = 'SELECT * FROM `new` '

43 self.get_conn()

44 try:

45 cursor = self.conn.cursor()

46 cursor.execute(sql)

47 news = cursor.fetchall()

48 # 将数据转为字典,让用户根据键来查数据

49 news_list =list(map(lambda x:dict(zip([x[0] for x in cursor.description],[d for d in x])),news))

50 # 这样也行,连续用两个列表生成式

51 news_list = [dict(zip([x[0] for x in cursor.description],row)) for row in news]

52 cursor.close()

53 self.close_conn()

54 return news_list

55 except AttributeError as e:

56 print(e)

57 return None

58

59def main():

60 # 获取一条数据

61 news = MysqlSearch()

62 new = news.get_one()

63 if new:

64 print(new)

65 else:

66 print('操作失败')

67

68 # 获取多条数据

69 news = MysqlSearch()

70 rest = news.get_all()

71 if rest:

72 print(rest)

73 print(rest[7]['type'],rest[7]['title'])

74 print('类型:{0},标题:{1}'.format(rest[12]['type'],rest[12]['title']))

75 for row in rest:

76 print(row)

77 else:

78 print('没有获取到数据')

79

80if __name__ == '__main__':

81 main()

这样就可以通过实例的方法来进行查询数据库了

我们还可以根据页数来进行查询指定的数据数

1 def get_more(self,page,page_size):

2 '''查多少页的多少条数据'''

3 offset = (page-1)*page_size

4 sql = 'SELECT * FROM `new` LIMIT %s,%s'

5 try:

6 self.get_conn()

7 cursor = self.conn.cursor()

8 cursor.execute(sql,(offset,page_size,))

9 news = [dict(zip([x[0] for x in cursor.description],new)) for new in cursor.fetchall()]

10 cursor.close()

11 self.close_conn()

12 return news

13 except AttributeError as e:

14 print(e)

15 return None

16

17def main():

18 #获取某页的数据

19 news = MysqlSearch()

20 new = news.get_more(3,5)

21 if new:

22 for row in new:

23 print(row)

24 else:

25 print('获取数据失败')

26

27if __name__ == '__main__':

28 main()

利用的是mysql的limit关键字,还有其他的,比如进行排序分组的感兴趣的可以自己尝试下

增加数据到数据库

1 def add_one(self):

2 sql = 'INSERT INTO `new`(`title`,`content`,`type`,`view_count`,`release_time`) VALUE(%s,%s,%s,%s,%s)'

3 try:

4 self.get_conn()

5 cursor = self.conn.cursor()

6 cursor.execute(sql, ('title', 'content', 'type', '1111', '2018-02-01'))

7 cursor.execute(sql, ('标题', '内容', '类型', '0000', '2018-02-01'))

8 # 一定需要提交事务,要不不会显示,只会占位在数据库

9 self.conn.commit()

10 return 1

11 except AttributeError as e:

12 print('Error:', e)

13 return 0

14 except TypeError as e:

15 print('Error:', e)

16 # 发生错误还提交就是把执行正确的语句提交上去

17 # self.conn.commit()

18 # 下面这个方法是发生异常就全部不能提交,但语句执行成功的就会占位

19 self.conn.rollback()

20 return 0

21 finally:

22 cursor.close()

23 self.close_conn()

24

25 def main():

26 news = OperateSQL()

27 if news.add_one():

28 print('增加数据成功')

29 else:

30 print('发生异常,请检查!!!')

31

32 if __name__ == '__main__':

33 main()

因为是增加数据,所以需要提交事务,这就需要用到conn .commit()来进行提交,在增加数据后,如果不提交,数据库就不会显示。

还有修改数据和删除数据就不贴出来了,只是把上面的sql变量的语句改成修改或者删除的语句就可以了,如果你还不会,建议练习下

END

作者:sergiojune Python爱好者社区专栏作者

个人公众号:日常学python

专注python爬虫,数据可视化,数据分析,python前端技术

python怎么返回上一步操作_一步一步教你如何用python操作mysql相关推荐

  1. 用python画皇冠_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码

    最近给大家整理了一下,挑了一些我觉得不错的代码分享给大家手把手教你如何用Python画一棵漂亮樱花树含源码. 动态生成樱花 效果图(这个是动态的): import turtle as T import ...

  2. python樱花树代码_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码

    最近,我整理出来,并选择一些代码,我觉得是好与你分享教你如何画一个美丽的樱花与Python源代码树.动态生成樱花进口龟Timport randomimport时间#画樱花的躯干(60 t) def树( ...

  3. python excel 打印文档_教你如何用Python轻轻松松操作Excel、Word、CSV,一文就够了,赶紧码住!!!...

    原标题:教你如何用Python轻轻松松操作Excel.Word.CSV,一文就够了,赶紧码住!!! 作者:奈何缘浅wyj Python 操作 Excel 常用工具 数据处理是 Python 的一大应用 ...

  4. python怎么画人像_教你如何用Python画出心目中的自己

    原标题:教你如何用Python画出心目中的自己 引言:人脸图像的生成在各个行业有着重要应用,例如刑事调查.人物设计.教育培训等.然而一幅逼真的人脸肖像,对于职业画家也要至少数小时才能绘制出来:对于从未 ...

  5. 用visio画用例图小人_教你如何用 Python 打飞机 ?

    前言:python 除了生孩子 ,啥都会 .包括打飞机 !今天就来教你如何用 python 打飞机 ! 简述 相信你是一个单纯的孩子说的打飞机是指啥意思 ,对吧 ?嗯 ,没毛病 .就是 pygame ...

  6. python批量删缩进_鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频?...

    鬼畜小姐姐+野狼disco,十分钟教你如何用Python剪辑一个牛逼的抖音小视频? 前言 半个月前,后台有个小伙伴问我,如何将视频中的音频提取出来,并且将声音转成文字写入到 word 中,正好接下来的 ...

  7. python怎么下载网络歌曲_教你如何用Python批量下载自己喜欢听得音乐

    文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 音乐是生活的调剂品,目前很多的音乐只能播放不能下载.生为技术员的我们,怎么甘心呢? ...

  8. python编程怎么建立工程_教你如何用Python脚本快速创建项目

    相信初学Cocos2D者对Python还很陌生,今天本篇教程教你如何用Python脚本快速创建项目. 在Cocos2d-x2.1.4以上的版本中,取消了使用vs模版创建项目的方法,开始使用python ...

  9. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  10. 教你如何用 Python 来实现一个大数据搜索引擎

    搜索是大数据领域里常见的需求.Splunk和ELK分别是该领域在非开源和开源领域里的领导者.本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理. 布隆过滤器 ...

最新文章

  1. mysql 比较大小 慢_MYSQL慢查询优化方法及优化原则
  2. 'utf-8' codec can't decode byte 0xff in position 0:
  3. python目录及文件操作
  4. python datetime格式转换_分别用Excel和python进行日期格式转换成时间戳格式
  5. 银行家算法总结及实现
  6. python 把多个list合并为一个并去重内容_110道Python面试题(上)
  7. Spring ---- ssm整合
  8. java服务器与客户端项目,Java项目中用于服务器和客户端软件包的共...
  9. mac上安装mongoDb以及简单使用
  10. Linux与网络服务(零)从零开始聊聊Linux相关概念(科普向)
  11. 巴菲特致股东的一封信:2007年
  12. 雅虎邮箱pop服务器,雅虎邮箱pop如何设置
  13. 小糊涂家装预算软件 v8.0 怎么用
  14. yolov4_u5版复现—3. 数据读入 dataset.py
  15. PHP算法之杨辉三角
  16. linux删除除非某某文件,find命令查找比某个文件新或...-linux下删除某一时间段的文件-scp命令在两台服务器直接进行文件传输的方法_169IT.COM...
  17. c语言小游戏----改版斗兽棋
  18. python实现小程序_python实现小程序
  19. 基础——ROM, RAM, FLASH, SSD, DDR3/4, eMMC, UFS, SD卡, TF卡,相互关系
  20. 微信公众平台开发调试

热门文章

  1. IOS 后台运行 播放音乐
  2. 有什么PDF阅读器?告诉你三个好用的PDF阅读软件
  3. 学习笔记25马氏链模型
  4. 哈佛职场情商课读书笔记
  5. 自动阅读 到底 能不能赚钱
  6. 某大厂程序员炫耀:来新加坡后,每天最多工作五六个小时,家庭年收入150万人民币,已躺平!...
  7. 信号与系统-连续系统的时域分析
  8. 智能驾驶系统简介和测试要点分析
  9. go 四种 base64 编码实现方式
  10. C++之回炉再造笔记--问题记录1