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

Python模块:MySQLdb/mysqlclient

Python模块 彭东稳 5393次浏览 已收录 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->提取数据->关闭连接这几个步骤。MySQLdb提供比较关键的对象,分别是Connection、Cursor、Result。

在CentOS系统下使用pip安装MySQLdb或mysqlclient库:

如果有报错就需要安装依赖:

如果安装有ipython,可以看到它有非常多的对象,如下:

我们这里主要说一下数据库的连接对象,及游标。

二、Connection对象

connect(parameters…)

用于创建到数据库的连接的构造函数,返回一个连接对象。请注意,一些参数必须指定为关键字参数!根据需要,每个参数的默认值为NULL或0。主要常用重要参数如下:

参数名 类型 说明
host 字符串 MySQL服务器地址
port 数值型 MySQL服务器端口,默认标准端口3306
user 字符串 连接用户名
passwd 字符串 用户密码
db 字符串 数据库名称
charset 字符串 连接字符集
connect_timeout 数值型 连接超时时间,默认不超时
compress 布尔型 是否压缩,默认不压缩

我们经常使用的只是这几个参数,但是其实里面还有很多比如字符集、线程安全、ssl等也都是很重要的参数,使用时要身份注意。

连接对象支持的方法:

方法名 说明
cursor() 使用该连接创建并返回游标对象
commit() 提交当前事务
rollback() 回滚当前事务
begin() 开始一个事务
close() 关闭连接

同样这里罗列了几个常用的,另外当使用Connection.query()函数进行query后,connection对象可以返回两种result,分别是store_result和use_result,store_result 将结果集存回client端,而use_result则是结果集保存在server端,并且维护了一个连接,会占用server资源。此时,不可以进行任何其他的查询。建议使用store_result,除非返回结果集(result set)过大或是无法使用limit的情形。

实例讲解:编写connection.py文件

执行结果:

可以看到成功连接了MySQL。

三、Cursor对象

下面介绍一下游标(cursor)对象: 用于对数据库执行增删改查

MySQL本身不支持游标(Cursor),但是MySQLdb对Cursor进行了仿真。重要的执行query方法有execute 和 executemany 。execute方法,执行单条sql语句,调用executemany方法很好用,数据库性能瓶颈很大一部分就在于网络IO和磁盘IO将多个insert放在一起,只执行一次IO,可以有效的提升数据库性能。游标具有fetchone、fetchmany、fetchall三个方法提取数据,每个方法都会导致游标游动,所以必须关注游标的位置。游标的scroll(value, mode)方法可以使得游标进行卷动,mode参数指定相对当前位置(relative)还是以绝对位置(absolute)进行移动。

游标对象支持的方法:

参数名 说明
execute(op[,args]) 执行一个数据查询命令,返回影响行数
fetchone() 取的结果集的下一行
fetchmany(size) 获取结果集的下几行
fetchall() 获取结果集中剩下的所有行
rowcount 最近一次execute返回的行数或影响行数
close() 关闭游标对象
execute方法:执行SQL、将结果从服务端获取到客户端

Python模块:MySQLdb/mysqlclient

fetch*方法:移动rownumber,返回数据。

  • 查询操作

Python模块:MySQLdb/mysqlclient

创建一张测试:

编辑cursor.py文件:

运行程序:

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

如果我们想把表里的数据格式化打印出来,因为从上面的结果我们可以看到返回的是元组的元组(tuple),我们通过for方法把它取出:

执行程序:

说明:字符串格式化操作符的右操作数如果是元组,那么在格式化字符串中必须将元组中的各个元素都有对应的转义说明符。否则会报错,如下:

另外MySQLdb还可以以Json格式输出(DictCursor),要做到这点也很简单,那就是建立数据库连接是传递cusorclass参数,或者在获取Cursor对象时传递cusorclass参数即可:

或者

展示结果如下:

  • 事务操作

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

Python模块:MySQLdb/mysqlclient

编辑一个增删改的脚本iud.py

执行程序,结果如下:

如果需要批量的插入数据,就这样做 :

每个值的集合为一个tuple,整个参数集组成一个tuple或者list,然后使用executemany方法来批量的插入数据。

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

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

<参考>

http://www.cnblogs.com/coser/archive/2012/01/12/2320741.html


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

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