python - mysql接口包学习笔记

本文探讨了在Python 3.10环境中,pymysql、mysqlclient和MySQLdb这三个数据库接口包的优缺点,重点比较了pymysql与mysqlclient的速度和使用场景,以及在遇到gevent兼容性和初学者安装挑战时的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:win10 64X
Python 3.10.0
Anaconda3

python - mysql接口包

使用python连接mysql,是需要三方包的,目前主流的方式就是pymysql 和 mysqlclient(也就是Python3版本的MySQLdb)。还有一个cymysql(fork of pymysql with optional C speedups)

提示:mysql-Python是Python2版本,它实现了Python数据库API规范V2.0,基于MySql C API上建立的。只支持Python2版本,不支持Python3版本,下面不予讨论。

那么如何选择接口包呢

首先了解一下pymysql 和 mysqlclient这两个库。
pymysql 和 mysqlclient这两个库的作者是同一个人INADA Naoki, pip库邮箱都指向mailto:songofacandy@gmail.com 。
PyMySQL的代码人员methane说mysqlclient比pymysql 速度更快。

那么,我们应该如何选择呢?首先,需要了解下这两个包。

  1. pymysql

    1)纯Python实现的,安装简单(直接pip安装)
    2) 由于纯Python实现的,可以很好的跟gevent框架结合

  2. mysqlclient

    1)是一个C扩展模块,编译安装可能会导致报各种错误,明显没有pymysql方便
    2)速度快;

对比上面,你就应该会清楚,pymysql的性能是比mysqlclient较差的,但是pymysql简单易使用。
当出现以下以下三种情况时采用pymysql:
1)出于某种原因你不能用libmysqlclient
2)你想使用gevent or eventlet 配合
3) 考虑mysql协议兼容性

原文是这样的:
mysqlclient-python is much faster than PyMySQL.
When to use PyMySQL is:
 
You can't use libmysqlclient for some reason
You want to use monkeypatched socket of gevent or eventlet
You wan't to hack mysql protocol

上面的原因,导致目前使用pymysql的程序员远超过mysqlclient,特别是第二条,现在的python站点,基本都要用gevent或者eventlet吧。

注意:当下强大的mysqlclient已经解决了上述因素,mysqlclient目前也是可以使用gevent了。直接上代码:

import MySQLdb     #### 特别注意,MySQLdb区分大小写
import gevent.hub
 
def _gevent_waiter(fd, hub=gevent.hub.get_hub()):
    hub.wait(hub.loop.io(fd, 1))
 
conn = MySQLdb.connect(
                db=self.db,
                host=self.host if not self.ssh else LOOPBACK_ADDRESS,
                port=self.port if not self.ssh else int(self.ssh.local_bind_port),
                user=self.user,
                password=self.passwd,
                charset=self.charset,
                connect_timeout=self.connect_timeout,
                cursorclass=DictCursor,
                use_unicode=True,
                waiter=_gevent_waiter,
            )

上面的连接方式,其他参数不多解释了,就说waiter吧,有了这个相当于mysqlclinet可以完美配合gevent了。

不了解那个_gevent_waiter,可以看看这篇文章 gevent hub 。

那么,我们怎么测试呢?测试过程比较简单,起一个单进程的 web服务,连接数据库的时候查询的时候,在数据库执行time.sleep 20秒,这个时候看其他请求这个 web服务还能处理请求不,用了waiter=_gevent_waiter完美啊。

有了这个,一个拥有大量数据库查询服务的系统,我可能再也不会用tornado了。。
大多程序猿还是比较怕麻烦,选择了简单易用但是性能较差的pymysql…pymysql比MySQLdb慢太多了,所以大项目感觉pymysql还是有点鸡肋啊,在此建议,使用MySQLdb

初次MySQLdb安装(没经验)

// 命令提示符输入指令
pip install mysqlclient

安装后,查询可知
在这里插入图片描述

安装验证方法:

测试非常简单,检查MySQLdb(注意大小写)模块是否可以正常导入。

测试中发现一个有趣的现象:
使用命令提示符(DOS)是正常的,如下图:
在这里插入图片描述
使用IDLE却有问题,如下图:

再试一下Pycharm,也是不行的,如下图:
在这里插入图片描述

验证失败,继续找原因

从PyCharm着手,搜索到一位高手的解决方法。原文如下

在学习Python的过程中,需要连接MySQL数据库。在shell命令模式下导入“import MySQLdb”,运行OK。
但在PyCharm中,执行代码总是出错,从网上搜集了解决的方法如下:

pycharm 里, project interpreter 里面没有 MySQLdb 。直接 import MySQLdb ,报错如下: 
import MySQLdb 
ImportError: No module named 'MySQLdb' 

解决办法:
pycharm 的 File->default settings->project Interpreter 的 package 里面有没有 mysql 的 package,选择了一个2.7的包就正常了。

依此方法执行,Pycharm仍然报错。内容如下:
在这里插入图片描述

错误提示
ERROR: Could not find a version that satisfies the requirement MySQLdb (from versions: none)
ERROR: No matching distribution found for MySQLdb
WARNING: You are using pip version 21.3.1; however, version 22.0.4 is available.
You should consider upgrading via the 'D:\Python_X64\test1\venv\Scripts\python.exe -m pip install --upgrade pip' command.

提示让升级pip程序。在命令提示符中进行操作,如下图:
在这里插入图片描述
可以看到第一次 pip install --upgrade pip 操作失败了。不过提示Consider using the --user option or check the permissions.

如下进行第二次操作pip install --user --upgrade pip,安装成功了。

pip install --user package_name

查了一下pip --user参数,将Python 程序包安装到 $HOME/.local 路径下,其中包含三个字文件夹:bin,lib 和 share。
然后修改 .bash_profile 文件使得 H O M E / . l o c a l / b i n 目 录 下 的 程 序 加 入 到 环 境 变 量 中 e x p o r t P A T H = HOME/.local/bin 目录下的程序加入到环境变量中 export PATH= HOME/.local/binexportPATH=HOME/.local/bin:$PATH

我理解为,这样就躲开了拒绝访问的问题。

pip升级问题解决了,但是MySQLdb还是无法使用。有点郁闷…

问题慢慢明了起来,应该是调用错了库。我的电脑上同时安装了Python3和Anaconda3。

同时安装Python3和Anaconda3,安装的第三方库会放在哪里?

在命令提示符中输入指令where pip 指令,就能看出来
在这里插入图片描述
原来有2套pip指令,有2套库存储位置。Python3和Anaconda3还有点模糊,可以在下一篇详细记录一下。

原来之前执行的pip install mysqlclient指令,一直是Anaconda3中的pip指令。

知道原因就好办了,在pycharm中设置一下应该就可以解决

网上搜索高手的解决方法:PyCharm配置anaconda环境步骤如下:

PyCharm是一款很好用很流行的python编辑器。Anaconda是专注于数据分析的Python发行版本,包含了condaPython等190多个科学包及其依赖项。

Anaconda通过管理工具包、开发环境、Python版本,大大简化了你的工作流程。不仅可以方便地安装、更新、卸载工具包,而且安装时能自动安装相应的依赖包,同时还能使用不同的虚拟环境隔离不同要求的项目。

Anaconda自带集成开发环境spyder。有些人不喜欢spyder的风格。个人感觉其提示功能也不及PyCharm。如果能将PyCharm配置anaconda环境,岂不美哉!接下来分享一下个人经验:

安装anaconda和pycharm再完成两者的安装之后:

  1. 配置Anaconda环境变量,在系统环境变量Path添加Anacond的安装路径和其子文件夹script和library/bin。(注释,安装Anaconda时已经自动配置,无需手动配置)

  2. 为PyCharm配置anaconda环境。进入PyCharm,依次点击File->Default
    Setting->Project Interpreter
    在这里插入图片描述
    在这里插入图片描述
    点击齿轮选择Add Local
    在这里插入图片描述
    我是选择第三个。之前认为理所当然是第二个,然而搞了半天不知怎么办。点击第三个选项卡,将路径选为anaconda安装路径下的python.exe,确定后成功配置anaconda环境。
    在这里插入图片描述
    在这里插入图片描述

之后,在该环境下创建的工程就可以使用anaconda中已有的库了。

在测试一下,连接成功!!!
在这里插入图片描述

问题完美解决,原来是对Python开发工具和库不了解产生的误解,基础不牢还要继续学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值