注册 登录
  • 欢迎访问"运维那点事",推荐使用Google浏览器访问,可以扫码关注本站的"微信公众号"。
  • 如果您觉得本站对你有帮助,那么可以扫码捐助以帮助本站更好地发展。

Python模块:PyMySQL

Python模块 彭东稳 336次浏览 已收录 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 – A dict of plugin names to a class that processes that plugin. The class will take the Connection object as the argument to the constructor. The class needs an authenticate method taking an authentication packet as an argument. For the dialog plugin, a prompt(echo, prompt) method can be used (if no authenticate method) for returning a string from the user. (experimental)
  • 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数据库操作,网上有很多例子。

<参考>

Python中操作mysql的pymysql模块详解


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (0)or分享 (0)
关于作者:

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