python - mysql接口包学习笔记

测试环境: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:[email protected]
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

安装后,查询可知
python - mysql接口包学习笔记_第1张图片

安装验证方法:

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

测试中发现一个有趣的现象:
使用命令提示符(DOS)是正常的,如下图:
python - mysql接口包学习笔记_第2张图片
使用IDLE却有问题,如下图:
python - mysql接口包学习笔记_第3张图片
再试一下Pycharm,也是不行的,如下图:
python - mysql接口包学习笔记_第4张图片

验证失败,继续找原因

从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仍然报错。内容如下:
python - mysql接口包学习笔记_第5张图片

错误提示
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程序。在命令提示符中进行操作,如下图:
python - mysql接口包学习笔记_第6张图片
可以看到第一次 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
    python - mysql接口包学习笔记_第7张图片
    python - mysql接口包学习笔记_第8张图片
    点击齿轮选择Add Local
    python - mysql接口包学习笔记_第9张图片
    我是选择第三个。之前认为理所当然是第二个,然而搞了半天不知怎么办。点击第三个选项卡,将路径选为anaconda安装路径下的python.exe,确定后成功配置anaconda环境。
    python - mysql接口包学习笔记_第10张图片
    python - mysql接口包学习笔记_第11张图片

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

在测试一下,连接成功!!!
python - mysql接口包学习笔记_第12张图片

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

你可能感兴趣的:(Python,python)