• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Python模块:PyMySQL

Python模块 彭东稳 7年前 (2018-03-29) 26433次浏览 已收录 0个评论

一、数据库驱动介绍

任何应用都离不开数据,所以在学习 Python 的时候,当然也要学习一个如何用 Python 操作数据库了。MySQLdb 就是 Python 对 MySQL 数据库操作的模块之一。在 Python 2 时代 MySQLdb 库可以说是标配,但是很遗憾目前 MySQLdb 还不支持 Python 3,官方说即将支持,但是市场已经没有了。

目前 Python 3 操作 MySQL 的驱动常用的有 pymysql 和 mysqlclient,其中 mysqlclient 是基于 MySQLdb 做的升级版本,支持 Python 3,以及修复了一些 Bug,用法跟 MySQLdb 基本相同。mysqlclient 的作者就是 pymysql 的作者,Github 地址:https://github.com/PyMySQL,反正这几个都学一学也没什么关系。

使用这种数据库接口大多是就是执行连接数据库 -> 执行query -> 提取数据 -> 关闭连接这几个步骤。pymysql 提供比较关键的对象,分别是 Connection、Cursor、Result,使用方式上与 MySQLdb 或 mysqlclient 没什么差别。

在 CentOS 系统下使用 pip 安装 pymysql 库即可。

下面简单学习一下这几个关键对象。

二、Connection对象

pymysql.connections.Connection(host=None, user=None, password=”, database=None, port=0, unix_socket=None, charset=”, sql_mode=None, read_default_file=None, conv=None, use_unicode=None, client_flag=0, cursorclass=<class ‘pymysql.cursors.Cursor’>, init_command=None, connect_timeout=10, ssl=None, read_default_group=None, compress=None, named_pipe=None, no_delay=None, autocommit=False, db=None, passwd=None, local_infile=False, max_allowed_packet=16777216, defer_connect=False, auth_plugin_map={}, read_timeout=None, write_timeout=None, bind_address=None, binary_prefix=False)

获得这个类的实例的正确方法是调用 connect() 方法,建立到MySQL数据库的连接,重要的常用参数如下:

  • host – 数据库服务器所在的主机。
  • user – 登录用户名。
  • password – 登录用户密码。
  • database – 连接的数据库。
  • port – 数据库开放的端口(默认: 3306)。
  • bind_address – 当客户端有多个网络接口时,请指定连接到主机的接口,参数可以是主机名或IP地址。
  • unix_socket – 使用unix套接字而不是tcp/ip。
  • charset – 连接字符集。
  • sql_mode – 默认SQL模式。
  • read_default_file – 指定my.cnf文件路径,以便从[client]部分读取参数。
  • conv – 要使用的转换字典,而不是默认值。
  • use_unicode – 是否默认为unicode字符串,对于Py3k,此选项默认为true。
  • client_flag – 发送到MySQL的自定义标志。
  • cursorclass – 使用自定义的游标类。
  • init_command – 建立连接时要运行的初始SQL语句。
  • connect_timeout – 建立连接超时时间。(默认: 10,最小: 1,最大: 31536000)
  • read_default_group – 从配置文件中读取组。
  • compress – 不支持
  • named_pipe – 不支持
  • autocommit – 设置自动提交模式,不设置意味着使用数据库默认。(默认值: False)
  • local_infile – 是否启用“LOAD LOCAL INFILE”命令的使用。(默认值: False)
  • max_allowed_packet – 发送到服务器的数据包的最大大小 (以字节为单位,默认值: 16MB),仅用于限制小于默认值 (16KB) 的 “LOAD LOCAL INFILE” 数据包的大小。
  • defer_connect – 不要显式连接建设,等待连接调用。(默认值: False)
  • auth_plugin_map – 自定义认证插件,具体看文档。
  • db – 连接数据库别名(兼容 MySQLdb 库)
  • passwd – 密码输入别名(兼容 MySQLdb 库)
  • binary_prefix – 在bytes和bytearray上添加_binary前缀(默认: False)

创建一个 Connection 对象:

这个Connection对象通过cursor方法查询返回的数据时tuple类型,如果想以字典类型输出创建Connection对象时需要加入这么一个参数:

Connection对象提供了如下方法:

方法 描述
begin() 开启事务
commit() 提交事务
cursor(cursor=None) 创建一个游标用来执行语句
ping(reconnect=True) 检查连接是否存活,会重新发起连接
rollback() 回滚事务
close() 关闭连接
select_db(db) 选择数据库
show_warnings() 查看warning信息

三、Cursor对象

建立完Connection对象后,就可以创建Cursor对象,如下示例:

pymysql支持with语句,所以一般就直接使用with语句。

Cursor对象支持的方法:

方法 描述
close() 关闭游标。
execute(query, args=None) 执行单条语句,传入需要执行的语句,是string类型;同时可以给查询传入参数,参数可以是tuple、list或dict。执行完成后,会返回执行语句的影响行数,如果有的话。
executemany(query, args) 执行多条INSERT语句,传入需要执行的语句;同时可以给查询传入参数,参数是一个mappings序列。执行完成后,会返回执行语句的影响行数,如果有的话。
fetchone() 获取下一行数据。
fetchall() 获取所有数据。
fetchmany(size=None) 获取几行数据。
read_next() 获取下一行数据。
callproc() 用来调用存储过程。
mogrify() 参数化查询,防止SQL注入。
scroll(num,mode) 移动游标位置。

创建一张测试:

  • 查询数据

运行程序,结果如下:

我们看到,每次使用fetch方法,都是在上一次fetch方法执行的结果的尾部开始。

  • 事务操作

对于MySQL来说,如果使用支持事务的存储引擎,那么每次操作后,commit是必须的,否则不会真正写入数据库,对应rollback可以进行相应的回滚,但是commit后是无法再rollback的。commit可以在执行很多sql指令后再一次调用,这样可以适当提升性能。

虽然MySQL默认是开启自动提交的,也就是说执行了DML操作后不需要commit动作。但是pymysql默认是没有开启自动提交事务,所以我们就必须手动提交或回滚事务。

基本操作如下:

执行程序,打印影响行数,结果如下:

正确使用,基本都是结合上下文管理器一块使用。

  • 批量插入 

对于批量插入,pymysql也提供了一个方法就是executemany(query, args),基本操作如下。

另外如果执行的SQL需要使用传参数,就使用如下格式:

通过上面的简单例子说明了通过Python的pymysql模块去进行MySQL数据库操作,网上有很多例子。

四、封装PyMySQL常见操作

使用上下文管理器来封装连接与操作有一个好处,__enter__有异常时不会调用__exit__,也就不会触发 conn 对象关闭操作,否则 conn 对象未生成时调用 close 又会触发异常。

使用方法:

<参考>

Python中操作mysql的pymysql模块详解

多线程场景pymysql线程池使用的一点总结


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (2)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!