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)

输出结果:

(1, 'Python从入门到放弃', '马云', 2019)

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)

输出结果如下:

[{'bookid': 1, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}, {'bookid': 2, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}]
{'bookid': 1, 'bookname': 'Python从入门到放弃', 'authors': '马云', 'year_publication': 2019}
  • 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()

输出结果如下:

(1, 'Python从入门到放弃', '马云', 2019)
(2, 'Python从入门到放弃', '马云', 2019)
(3, '21天完全入门Java', '扎克伯格', 2018)
(4, 'Linux学习手册', '李纳斯', 2017)
(5, 'MySQL从删库到跑路', '比尔盖茨', 2018)
注意:流式游标虽然也有fetchall()方法,调用后的结果与普通游标一样返回所有数据,但是最好别去调用,这样会失去流式游标的优势。使用流式游标时,如果数据量很大,导致游标一直处在循环遍历状态,这时,数据库连接(conn)是被占用的,不能再被用于执行其他sql,如果要执行其他sql那就必须再创建一个数据库连接,游标占用数据库连接的时长是有限制的,如果流式游标一直在遍历,60秒后数据库连接会断开,不过可以在创建数据库连接时传入参数init_command=("SET NET_WRITE_TIMEOUT=XX")来设置这个超时时间。

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指南的更多相关文章

  1. Python+request 使用pymysql连接数据库mysql的操作《十》

    使用指南.pymysql支持python2.7同时也支持python3.x.当前我用的是python2.7.所以过断选择了pymysql的使用,这里注意几点.一般我们连接数据库为了安全起见,都会要求按 ...

  2. pymysql(一)检索、增加、更新、删除数据

    (一)  SELECT 检索数据 代码如下: import pymysql '''pymysql使用指南host = '127.0.0.1'回送地址,指本地机port = 3306MySQL的默认端口 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. UE4新手之编程指南

    虚幻引擎4为程序员提供了两套工具集,可共同使用来加速开发的工作流程. 新的游戏类.Slate和Canvas用户接口元素以及编辑器功能可以使用C++语言来编写,并且在使用Visual Studio 或 ...

  5. JavaScript权威指南 - 对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自 ...

  6. JavaScript权威指南 - 数组

    JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...

  7. const extern static 终极指南

    const extern static 终极指南 不管是从事哪种语言的开发工作,const extern static 这三个关键字的用法和原理都是我们必须明白的.本文将对此做出非常详细的讲解. co ...

  8. Atitit.研发管理软件公司的软资产列表指南

    Atitit.研发管理软件公司的软资产列表指南 1. Isv模型下的软资产1 2. 实现层面implet1 3. 规范spec层1 4. 法则定律等val层的总结2 1. Isv模型下的软资产 Sof ...

  9. HA 高可用软件系统保养指南

    又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...

随机推荐

  1. Java Socket基础[备忘]

    1.服务端----Server.java import javax.swing.*; import java.io.*; import java.net.*; import java.awt.*; i ...

  2. Windows 上静态编译 Libevent 2.0.10 并实现一个简单 HTTP 服务器(图文并茂,还有实例下载)

    [文章作者:张宴 本文版本:v1.0 最后修改:2011.03.30 转载请注明原文链接:http://blog.s135.com/libevent_windows/] 本文介绍了如何在 Window ...

  3. Delphi驱动开发研究第一篇--实现原理

    Delphi能不能开发Windows的驱动程序(这里的驱动程序当然不是指VxD了^_^)一直是广大Delphi fans关注的问题.姑且先不说能或者不能,我们先来看看用Delphi开发驱动程序需要解决 ...

  4. Silverlight ItemsControl详细解析+解惑

    Silverlight最强大的地方就在于定义控件了,Silverlight提供了非常灵活和高效的控件定义方式,几乎可以实现任何复杂的控件实现,对于快速开发应用程序有着重要的意义.在Silverligh ...

  5. KM算法 详解+模板

    先说KM算法求二分图的最佳匹配思想,再详讲KM的实现.[KM算法求二分图的最佳匹配思想] 对于具有二部划分( V1, V2 )的加权完全二分图,其中 V1= { x1, x2, x3, ... , x ...

  6. SpringBoot整合日志框架LogBack

    日志可以记录我们应用程序的运行情况,我们可以通过日志信息去获取应用程序更多的信息.常用处理java日志的组件有:slf4j.log4j.logback.common-logging等.其中log4j是 ...

  7. Netty源码分析--NIO(一)

    好久没写博客了,最近打算花些时间把Netty的源码好好读一读,下面是本人在学习的过程中的一些笔记,不能确保自己思考的完全是正确的,如果有错误,欢迎大家指正. 由于本人的语文功底烂的很,通篇使用大白话来 ...

  8. 数据库读写分离Master-Slave

    数据库读写分离Master-Slave 一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢,这时我们需要一些有效的优化手段来提高数据库的执行速度:如SQL优化.表结构优化.索引优化.引擎 ...

  9. 【fullGC】内存监控工具

    什么是fullGC: 从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的J ...

  10. Spring 之Aop实现日志记录

    Aop实现见代码,简单demo实现 package com.idcos.automate.config; import com.idcos.automate.dal.auto.dao.dcos.Dco ...