安装

通过pip安装

1
pip install mysqlclient

测试是否安装成功

1
python -c "import MySQLdb"

如果出现以下报错

Library not loaded: @rpath/libmysqlclient.21.dylib

创建对应软链

1
2
3
>>> ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib
>>> ln -s /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib/libcrypto.1.1.dylib
>>> ln -s /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib/libssl.1.1.dylib

使用

连接数据库

1
2
3
from MySQLdb import _mysql

db = _mysql.connect(host="localhost", port=3306 user="user", passwd="password", db="database")

上面代码通过UNIX socket连接本地MySQL服务。

一般来说,将密码写在代码里面并不明智:

1
db = _mysql.connect(host="localhost", db="database", read_default_file="~/.my.cnf")

这个实现的效果跟上一个例子是相同的,但是账号密码和其它参数是通过 ~/.my.cnf 获取,更详细信息参考 option files

现在可以通过 db 变量来执行sql语句 db.query()

1
db.query("""SELECT spam, eggs, sausage FROM breakfast WHERE price < 5""")

该语句没有返回值,但可以捕获异常。异常被定义在不同的模块 MySQLdb._exceptions 中。

获取结果

db.query() 没有返回值,那要如何获取结果?有两种方式:

1
2
3
r = db.store_result()
# or
r = db.use_result()

两种方式均返回结果集对象,有什么不同呢?

store_result() 返回的是所有结果集,当查询数据较大时使用 limit 限制条数。

use_result() 将结果集暂存在服务中并一条一条获取,除非获取完所有数据,否则不会执行其它query。

一般情况下建议使用 store_result() ,除非无法使用 limit 并且结果集非常大。

然后通过 fetch_row() 获取数据

1
2
>>> r.fetch_row()
(('3','2','0'),)

fetch_row() 接收一些的参数

  • maxrows 返回的记录条数,默认是1,当为0时表示返回所有结果集
  • how 返回值的类型
    • 0 tuple元组类型,默认
    • 1 dictionary字典类型,以字段名作为键值

留意到上面的元组数据,数字类型的字段也返回成了string。这是因为MySQL默认将所有结果返回成string类型,莫非要自己一个一个转换?那不是很操蛋?

其实 MySQLdb已经帮我们想好。在调用 connect() 连接MySQL的时候通过传 conv 参数实现自动转换。

1
2
3
4
5
from MySQLdb.constants import FIELD_TYPE

int_conv = { FIELD_TYPE.LONG: int }

db = _mysql.connect(conv=int_conv, ...)

这样返回的结果就正常了 ((3, 2, 0),)

常用方法

  • conn.insert_id() 获取最后插入ID
  • conn.affected_rows() 影响行数
  • _mysql.debug() 打开调试