Python3 使用 mysqlclient 连接 MySQL / MariaDB

译者:anxin
日期:2017-11-05

Mysqlclient是MySQLdb连接库的一个分支,它修复了一些在MySQLdb连接路中存在的bug,并添加了对Python3的支持。Mysqlclient的底层是由C编写实现的,相比于PyMySQL,运行速度快一些。

安装mysqlclient

因为mysqlclient的底层是用C语言实现的,mysqlclient运行时会调用Python3的C语言头文件,和MySQL / MariaDB的C语言头文件,所以首先需要安装 GCC编译器,Python的C语言头文件,MariaDB的C语言头文件。

1)安装GCC编译器

#CentOS / RHEL安装 GCC 编译器
sudo yum install gcc

#Debian / Ubuntu 安装 GCC 编译器
sudo apt-get install gcc

2)安装Python3的C语言头文件

Python3的C语言头文件在CentOS系统下软件包为python3-devel(修改为你使用的相应软件源的软件包名);Python3的C语言头文件在Debian系统下软件包为python3-dev。这些软件包如要误以为是Python3的开发版软件包,而是Python3的C语言头文件和链接库。

#CentOS / RHEL安装 Python3 C语言头文件
sudo yum install python3-devel

#Debian / Ubuntu 安装 Python3 C语言头文件
sudo apt-get install python3-dev

3)安装 MySQL / MariaDB C语言头文件

MySQL在CentOS7下需要使用其他的软件源,在Debian系统下C语言头文件的软件包为libmysqlclient-dev;MariaDB在CentOS系统下C语言头文件的软件包名为mariadb-devel,在Debian系统下C语言头文件的软件包为libmariadbclient-dev

#CentOS / RHEL安装 MariaDB C语言头文件
sudo yum install mariadb-devel

#Debian / Ubuntu 安装 MySQL / MariaDB C语言头文件
sudo apt-get install libmysqlclient-dev

sudo apt-get install libmariadbclient-dev

4)首先要在系统上安装了Python3,最好再创建一个Python3的虚拟环境,然后在Python3的虚拟环境中安装mysqlclient连接库

pip install mysqlclient

Mysqlclient 连接MySQL / MariaDB数据库接口说明

Mysqlclient按照 DB API 2.0 标准实现,所以mysqlclient提供的操作数据库的两个重要类是Connection,Cursor,和获取数据库连接的快捷函数connect()。

connect(**kwargs)

connect()函数其实是Connection类的构造函数的一个快捷函数,用于构造一个数据库连接,语法形式如下:

conn = mysqlclient.connect(**kwargs)

常用的**kwargs参数说明如下:

  • host:主机名或 IP 地址(可选,默认为本地计算机)
  • port:连接MySQL / MariaDB数据库使用的端口(可选,默认为3306)
  • db:连接的数据库
  • user:连接数据库的用户
  • passwd:连接数据库用户的密码
  • charset:数据库操作使用的字符集,中文一般选择utf8

Connection类方法说明

  • Connection(**kwargs)构造函数

    用于构造一个到MySQL / MariaDB数据库的连接,常用的是使用connect()快捷函数构造数据库连接,语法形式如下:

    conn = mysqlclient.connections.Connection(**kwargs)
  • connection.cursor()

    用于从当前的数据库连接中获取一个Cursor对象(游标),用于执行SQL语句。

  • connection.close()

    关闭当前的数据库连接

Cursor类方法说明

  • cursor.execute(query)

    用于执行SQL语句 query

  • cursor.fetchall()

    获取SQL执行结果中的所有记录,返回值是一个元组的列表,每一条记录是一个元组

  • cursor.fetchmany(([size=cursor.arraysize]))

    获取SQL执行结果中指定条数的记录,记录数由size指定,当不指定size值时,默认为arraysize属性的值,arraysize属性的默认值是1;返回值是一个元组的列表,每一条记录是一个元组

  • cursor.fetchone()

    获取执行结果中的一条记录

  • cursor.close()

    关闭当前连接的游标

Python3使用mysqlclient连接MySQL / MariaDB实例

mysqlclientMySQLdb连接库的一个分支,所以在程序中使用mysqlclient,需要导入的Python3包是MySQLdb

如下的实例是一个Python3的WSGI程序,此程序是一个Web脚本,在脚本中,我们创建article表,如果创建成功则在页面中提示创建表成功,否则,提示创建表失败。

# -*- coding: utf-8 -*-
import MySQLdb

def application(environ, start_response):
    try:
        conn = MySQLdb.connect(user="root", passwd="su@db@yuzhi100", db="myapp" charset="utf8")
        try:
            cur = conn.cursor()
            cur.execute('''CREATE TABLE article (
                             art_id      integer UNSIGNED AUTO_INCREMENT,
                             title       varchar(128),
                             content     text,
                             author      varchar(128),
                             pub_date    date,
                             PRIMARY KEY(art_id)
                         )DEFAULT CHARSET=utf8;''')
            conn.commit()
        except MySQLdb.OperationalError:
            output = '创建表失败!'
        else:
            cur.close()
    except MySQLdb.OperationalError:
        output = '数据库连接失败!'
    else:
        output = '创建表成功!'
        conn.close()

    status = '200 OK'
    response_headers = [('Content-type', 'text/html; charset=utf-8')]
    start_response(status, response_headers)

    return [output.encode()]

实例中我们只演示了创建数据库的实例,其他的实例只需把相应的SQL语句放在execute()函数中执行即可。

Mysqlclient中可用的异常错误类

异常错误类的继承关系如下:

StandardError
|__Warning
|__Error
   |__InterfaceError
   |__DatabaseError
      |__DataError
      |__OperationalError
      |__IntegrityError
      |__InternalError
      |__ProgrammingError
      |__NotSupportedError

Mysqlclient中异常错误类的具体说明如下:

异常 描述
mysqlclient.Warning 当有严重警告时触发,例如插入数据是被截断等等。
mysqlclient.Error 警告以外所有其他错误类。
mysqlclient.InterfaceError 当有数据库接口模块本身的错误(而不是数据库的错误)发生时触发。
mysqlclient.DatabaseError 和数据库有关的错误发生时触发。
mysqlclient.DataError 当有数据处理时的错误发生时触发,例如:除零错误,数据超范围等等。
mysqlclient.OperationalError 指非用户控制的,而是操作数据库时发生的错误。例如:连接意外断开、 数据库名未找到、事务处理失败、内存分配错误等等操作数据库是发生的错误。
mysqlclient.IntegrityError 完整性相关的错误,例如外键检查失败等。
mysqlclient.InternalError 数据库的内部错误,例如游标(cursor)失效了、事务同步失败等等。
mysqlclient.ProgrammingError 程序错误,例如数据表(table)没找到或已存在、SQL语句语法错误、 参数数量错误等等。
mysqlclient.NotSupportedError 不支持错误,指使用了数据库不支持的函数或API等。例如在连接对象上 使用.rollback()函数,然而数据库并不支持事务或者事务已关闭。
本文链接:/tutorial/python3/python3-mysqlclient-mysql-mariadb

本文版权归知站所有,未经站长同意不得转载,谢谢尊重作者劳动成果!