pymysql指南
1 引言
mysql应该说是如今使用最为普遍的数据库了,没有之一,而Python作为最为流行的语言之一,自然少不了与mysql打交道,pymysql就是使用最多的工具库了。
2 创建库、表
我们先从创建数据库、数据表说起,有了库表,后面的增删改查才有根据。
2.1 创建数据库
pymysql的所有对数据库的操作都必须先与数据库服务建立连接,然后创建游标为基础执行具体的sql语句。创建数据库方法如下:
- # -*- coding: utf-8 -*-
- import pymysql
- conn = pymysql.connect( # 创建数据库连接
- host='10.10.11.131', # 要连接的数据库所在主机ip
- user='chb', # 数据库登录用户名
- password='123456!', # 登录用户密码
- charset='utf8' # 编码,注意不能写成utf-8
- )
- cursor = con.cursor()
- cursor .execute("create database test_db character set utf8;")
- # 执行完之后别忘了关闭游标和数据库连接
- cursor.close()
- conn.close()
上面代码执行完后,就创建了一个名为test_db的数据库:

2.2 创建数据表
- # -*- coding: utf-8 -*-
- import pymysql
- conn = pymysql.connect( # 创建数据库连接
- host='10.10.11.131', # 要连接的数据库所在主机ip
- user='chb', # 数据库登录用户名
- password='123456!', # 登录用户密码
- database='test_db', # 连接的数据库名,也可以后续通过cursor.execture('user test_db')指定
- charset='utf8' # 编码,注意不能写成utf-8
- )
- cursor = conn.cursor() # 创建一个游标
- # 需要执行的创建表的sql语句
- sql = """
- create table book(
- bookid int auto_increment primary key ,
- bookname VARCHAR(255) not null ,
- authors VARCHAR(255) not null ,
- year_publication YEAR not null
- );
- """
- cursor.execute(sql) # 使用游标执行sql
- # 执行完之后别忘了关闭游标和数据库连接
- cursor.close()
- conn.close()

在这个创建数据表的例子中,在创建数据库服务连接时,我们通过 database='test_db'这行代码指定参数连接了目标数据库,如果不想在创建数据库服务连接时指定数据库,可以在后续通过cursor.execture('user test_db')这种方法指定数据库。
从上面创建数据库和数据表的例子可以看出,pymysql执行具体操作时都是先创建数据库服务连接,然后通过连接创建游标,以游标来执行具体的sql语句来完成具体的对数据库操作。不单单可以创建数据库、数据表,还可以创建索引、视图等等,方法也是一样的,这里不再介绍。
3 增删改查
3.1 插入
插入操作可以通过游标的execute和executemany两个方法来完成。注意:只要是对数据表有修改的操作(插入、更新、删除)在使用execute方法后,都需要再次调用commit方法对数据库的修改才会最终生效。
execute方法一次插入一条记录,executemany一次插入多条记录:
(1)execute:一次插入一条记录
- cursor.execute('insert into book(bookname, authors, year_publication) values("%s", "%s", %s);' % ('Python从入门到放弃', '乔布斯', 2019))
- conn.commit()

上面这种写法是先用字符串利用%s占位生成一条完整的sql语句,然后去执行。其实,pymysql的游标也自带这一功能,而且看起来更加方便,所以,我们还可以这样执行execute方法:
- cursor.execute('insert into book(bookname, authors, year_publication) values(%s, %s, %s);', ('Python从入门到放弃', '乔布斯', 2019))
- conn.commit()

这种方法的好处是sql语句中的%s不需要加引号(如果加了引号,引号也会被当做数据插入到数据表中),游标执行这一语句时,会根据数据类型来判断是否要加上引号。
(2)executemany:一次插入多条记录
- data = [
- ('21天完全入门Java', '扎克伯格', 2018),
- ('Linux学习手册', '李纳斯', 2017),
- ('MySQL从删库到跑路', '比尔盖茨', 2018),
- ]
- cursor.executemany('insert into book(bookname, authors, year_publication) values("%s", "%s", %s);', data)
- conn.commit()

3.2 更新
- cursor.execute('update book set authors=%s where bookname=%s;', ["马云", "Python从入门到放弃"])
- conn.commit()

3.3 查询
查询是最最要但也是最复杂的一个操作了。我们分为fetch操作、游标两部分来说。
(1)fetch操作
插入、更新、删除操作必须再执行commit操作之后才会生效,而查询操作也只有在执行fetch操作之后才会生效。fetch操作包括3个方法,分别是fetchone()、fetchall()、fetchmany()。
- fetchall():查询指定的所有记录
- cursor.execute('select * from book where bookid < %s;', [4])
- books = cursor.fetchall()
- print(books)
输出结果为:
((1, 'Python从入门到放弃', '马云', 2019), (2, 'Python从入门到放弃', '马云', 2019), (3, '21天完全入门Java', '扎克伯格', 2018))
输出结果是以元组的形式来保存,且每一条记录也是一个元素,这是由游标cursor决定的,在下文中还会说到。
- fetchmany(size):查询指定数量的记录
- cursor.execute('select * from book where bookid < %s;', [4])
- books = cursor.fetchmany(2)
- print(books)
输出结果为:
((1, 'Python从入门到放弃', '马云', 2019), (2, 'Python从入门到放弃', '马云', 2019))
可以看出,fetchmany(size)是取出符合查询条件的最前面的指定数量记录。这里的size指的就是想要取出的记录条数。
- fetchone():取出第一条记录
- cursor.execute('select * from book where bookid < %s;', [4])
- books = cursor.fetchone()
- print(books)
输出结果:
fetchone()相当于是fetchmany(1),取出第一条符合查询条件的记录。
(2)游标
我们之前使用游标都是采用默认的Cursor类型,除此以外,pymysql还提供了DictCursor、SSCursor、SSDictCursor这几类游标。
- DictCursor
之前使用的Cursor返回的数据是以元组的方式保存,而DictCursor是以字典的形式保存。创建这种类型的游标方法也很简单,在conn.sursor()方法中传入DictCursor这个类即可:
- cursor = conn.cursor(pymysql.cursors.DictCursor) # 创建一个字典游标
- cursor.execute('select * from book where bookid < %s;', [3])
- books = cursor.fetchall()
- print(books)
- cursor.execute('select * from book where bookid < %s;', [3])
- book_one = cursor.fetchone()
- print(book_one)
输出结果如下:
- SSCursor和SSDictCursor
SSCursor和SSDictCursor被称为流式游标,这类游标不会像上面使用的Cursor和DictCursor那样,一次性返回所有的数据,流式游标会陆陆续续一条一条得返回查询数据,所以这类游标适用于内存低、网络带宽小、数据量大的应用场景中。
流式游标的使用方法类似于迭代器,再循环中每取一条,生成一条:
- cursor = conn.cursor(pymysql.cursors.SSCursor) # 创建一个流式游标
- cursor.execute('select * from book;')
- book = cursor.fetchone()
- while book:
- print(book)
- book = cursor.fetchone()
输出结果如下:
SSCursor与SSDictCursor的区别就类似于Cursor和DictCursor的区别,这里就不在介绍了。
3.4 删除
使用pymysql执行插入、更新、删除操作都是相似的,最后都需要commit提交:
- cursor.execute('delete from book where bookid=%s;', [1])
- conn.commit()
这时候,bookid为1的记录已经被删除,如下图所示:

也可以使用executemany()一次性删除多条:
- cursor.executemany('delete from book where bookid=%s;', [[2], [4]])
- conn.commit()
如下图所示,bookid为2和4的记录已经被删除:

4 总结
pymysql还提供了事务机制,但我还有疑问没搞清楚,不敢往博客上面写:执行多个修改数据库操作(多个execute方法)时,其中有一个方法有异常,这是commit,所有的所有都不会成功,那么为什么还要rollback呢?如果哪位前辈知道答案,请一定告知,感激不尽!
参考:
https://www.cnblogs.com/xfxing/p/9322199.html
https://www.runoob.com/python3/python3-mysql.html
https://www.jianshu.com/p/1ba64df4fd15
pymysql指南的更多相关文章
- Python+request 使用pymysql连接数据库mysql的操作《十》
使用指南.pymysql支持python2.7同时也支持python3.x.当前我用的是python2.7.所以过断选择了pymysql的使用,这里注意几点.一般我们连接数据库为了安全起见,都会要求按 ...
- pymysql(一)检索、增加、更新、删除数据
(一) SELECT 检索数据 代码如下: import pymysql '''pymysql使用指南host = '127.0.0.1'回送地址,指本地机port = 3306MySQL的默认端口 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- UE4新手之编程指南
虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...
- JavaScript权威指南 - 对象
JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- const extern static 终极指南
const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...
- Atitit.研发管理软件公司的软资产列表指南
Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...
- HA 高可用软件系统保养指南
又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...
随机推荐
- WCF研究-中篇
中篇 5.托管于宿主 6.消息模式 7.WCF行为-实例管理和并发控制 8.安全 5.托管于宿主 托管 宿主Host Ø承载WCF Service运行的环境 自承载方式 系统服务方式 IIS方式 WA ...
- Qt4编译生成VS静态库(静态编译),有三个bat文件 good
开发环境:vs2008+Qt4.8.4源码库 其他环境请自己尝试,原理应该是差不多的 Qt编译生成静态库 1. 本教程只针对在win32平台,使用VS开发工具(例子以VS2008为例) ...
- win7访问部分win2003速度慢
解决办法: 关闭TCPIP协议的自动优化调整功能,在win7上,以管理员身份运行cmd,输入 netsh interface tcp set global autotuninglevel=disabl ...
- hive表批处理
对hive中的表进行批量处理,如下是一个简单的脚本 #给定一个hive数据库名,生成它的所有表的create SQL语句,并导出到文件 create_fun(){ hive -e } #显示一个表中所 ...
- Spring与IoC
控制反转(IOC,Inversion of Control),是一个概念,是一种思想. 指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理.控制反转就是对对象控制权的转移 ...
- AI行为树的工作原理
很久没写博客了,最近在项目刚部署到测试服,需要进行压测,老大相当专业的用了行为树来组织压测机器人的代码,这段时间陆陆续续在网上看了不少关于行为树的文章,其中有一篇我觉得写得非常到位,它原文是英文,链接 ...
- Laravel --- 如何较优雅的使用公用函数
一.创建公用文件 App/Helpers/CommonHelper.php 二.创建Provider php artisan make:provider HelperServiceProvider C ...
- 《大型网站系统与Java中间件》读书笔记 (中)
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾上一篇: <大型网站系统与Java中间件& ...
- PATB 1018. 锤子剪刀布
时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图 ...
- 23 | 知其然知其所以然:聊聊API自动化测试框架的前世今生