在 Python 中如何连接 MySQL 数据库

2020-11-23 language python

在 Python 中多种方式可以访问 MySQL 服务端,这里介绍几种常用的库。

mysqlclient

这是最简单高效的客户端,依赖 mysql-connector-c 的 C 库实现,实际上就是对库的简单封装,提供了一个基础的 _mysql 动态库,详细可以参考 Docspypigithub 等介绍。

安装

因为使用了 Python 模式的动态库,需要依赖 Python 以及 MySQL 的开发包。

# yum install gcc python3-devel mysql-devel pkgconfig
# pip3.9 install mysqlclient

示例

Python 实际提供了操作数据库的接口,正常 SQL 的执行是通过游标完成的。

import MySQLdb

# 建立链接
conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
# 创建游标
cur = conn.cursor()
# 执行SQL语句,可以是DDL、DML等
cur.execute("insert into student values('2','Tom','3 year 2 class','9')")
# 关闭游标
cur.close()
# 提交事物
conn.commit()
# 关闭数据库连接
conn.close()

还可以直接使用 _mysql 库。

from MySQLdb import _mysql as mysql

db = mysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123456', db='test')
# 执行查询,此时可能会抛出MySQLError错误
db.query("SELECT * FROM foobar WHERE price < 5")
# 获取执行结果,其中use结果会缓存在Server侧,后续则一条条获取,而store则立即获取所有结果
r = db.use_result() # NOT TEST
r = db.store_result()
# 获取结果数据
for _ in range(r.num_rows()):
    r.fetch_row()

PyMySQL

PyMySQL 一个纯 Python 实现,在 Issues #342 介绍为什么要使用 PyMySQL 而非 mysqlclient-python 库的原因。

简单来说,前者需要安装依赖一堆的 MySQL、Python 相关开发库,而且无法直接通过类似 monkey patched 的方式异步化。

使用时直接通过 pip3 install PyMySQL 命令安装,使用方式如下。

import pymysql

db = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="xxx", database="foobar")
with db.cursor()