mac安装mysqlclient出现的问题

安装python mysql中间件

自从甲骨文收购的MySQL之后,原引领的MySQL的创始人就离开了MySQL中,创立了新的MariaDB的,表示他不再看好mysql的。

而今天让我遇到了一个问题,正好证明了这一点。最近在做的一个小玩意中,有很多经过蟒蛇收集和处理过的数据,需要存入数据库,而经常使用的mysql,mysql的把作为数据库的载体自然是在正常不过了。

最新的蟒版本是3,而蟒官方团队也在有条不紊的由python2过渡到python3,因此整个项目都是基于python3的.python操作的MySQL数据库需要安装的MySQL-蟒的驱动。而官方提供了很多可选项,而通过对比之后,的mysqlclient是完全支持python3的,并且基于C,速度很快,因此最佳选择方案就是它了。

按照官方文档安装  mysqlclient,PS,我的环境是Mac

# 安装mysql驱动,你的电脑很可能已经安装过了
brew install mysql-connector-c

# 安装mysqlclient
pip install mysqlclient

然后万恶的报错了,你懂的。我用了这么多年的MySQL的,今天是第一次遇到了这么雷人的错误。以往遇到的MySQL的问题,随手谷歌,立马问题就能解决,但是今天不一样了。逛了2个小时的Stack Overflow,仍然没有结果。下面是报的错误。

Collecting mysqlclient
  Using cached mysqlclient-1.3.10.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "", line 1, in <module>
      File "/private/var/folders/rv/a_a/T/pip-build-nyaa8t95/mysqlclient/setup.py", line 17, in <module>
        metadata, options = get_config()
      File "/private/var/folders/rv/a_a/T/pip-build-nyaa8t95/mysqlclient/setup_posix.py", line 54, in get_config
        libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]
      File "/private/var/folders/rv/a_a/T/pip-build-nyaa8t95/mysqlclient/setup_posix.py", line 54, in <listcomp>
        libraries = [dequote(i[2:]) for i in libs if i.startswith('-l')]
      File "/private/var/folders/rv/a_a/T/pip-build-nyaa8t95/mysqlclient/setup_posix.py", line 12, in dequote
        if s[0] in "\"'" and s[0] == s[-1]:
    IndexError: string index out of range

左右检查蟒安装和PIP的版本,都是最新的稳定版,没有任何问题。然后就在github上遇到另一个哥们,遇到和我一模一样的问题,我们都是MAMP + Python3.6 + MYSQL5。 6.连报的错误都一样,唯一不同的是,他是的virtualenv,
而我是pyenv,实际上这两者并没有区别。

这个问题,mysqlclient开发小组的核心成员,来自日本的大神INADA Naoki给出了临时性的解决办法。他说,这是由于mysql的bug引起的问题,自十一月份开始陆续有人遇到这个问题,这个问题也让他很烦躁,是啊,这是Oracle的问题,而大家却都来找mysqlclient提交bug,是你你能不气,这锅至少我也不愿意背。具体可以去翻github mysqlclient的问题

出现这个问题的原因是MySQL的连接器-C中配置项有误。

具体针对MAC来说,你需要顺藤摸瓜找到mysql_config的真身,即

/usr/local/Cellar/mysql-connector-c/6.1.11/bin/mysql_config

cd /usr/local/Cellar/mysql-connector-c/6.1.11/bin/mysql_config

# 修改前先备份
cp  mysql_config mysql_config.backup

# 使用vi修改配置文件
sudo vi mysql_config

# 114 gg跳转到 114行> # Create options 
> libs="-L$pkglibdir"
> libs="$libs -l "

替换为

> # Create options 
> libs="-L$pkglibdir"
> libs="$libs -lmysqlclient -lssl -lcrypto"



然后保存即可。

#  然后重新运行mysqlclient安装命令,之后一切顺利,大功告成
pip install mysqlclient

注意,这是一种脏修复,不优雅,我们不应该去修改源码,但是这是目前一种可行的办法,祈祷Oracle尽快修复这个问题吧。

使用python MySQLdb(由python / mysqlclient提供)

# 打开python交互模式
import MySQLdb
# 如果以上命令没有弹出任何错误则一切正常,如果报错,这说明你的安装有误。

# 连接数据库
db = MySQLdb.connect("localhost","db_user","passwd","db_name")

# 如果你是MAC,你很可能会报以下错误

> Traceback (most recent call last):
>   File "", line 1, in <module>
>   File "/Users/username/.pyenv/versions/3.5.2/lib/python3.5/site-packages/MySQLdb/__init__.py", line 86, in Connect
    return Connection(*args, **kwargs)
>  File "/Users/username/.pyenv/versions/3.5.2/lib/python3.5/site-packages/MySQLdb/connections.py", line 204, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
> _mysql_exceptions.OperationalError: (2002, "Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)")

# 在bash下查看mysql_config的socks配置选项
mysql_config --socket

> /tmp/mysql.sock 

这个错误看起来很熟悉,是因为MAMP环境下,mysql socks的位置在MAMP的安装目录下,并不在/ tmp / mysql目录下,MYSQLdb对象无法使用connect方法连接到mysql的socks自然就报错了。

两个解决办法:

  1. 从/Applications/MAMP/tmp/mysql/mysql.sock新建一个符号链接到的/ tmp /目录下,这种方式不推荐,因为MAC会自动更新系统自带的MySQL的版本,而下一次更新的时候,MySQL的袜子又会被替换,到时候还得改。

  2. 直接将mysql_config的袜子地址配置选项改为/Applications/MAMP/tmp/mysql/mysql.sock

sudo vi /usr/local/Cellar/mysql-connector-c/6.1.11/bin/mysql_config

# 找到103行  socket='/tmp/mysql.sock'
# 改为 socket='/Applications/MAMP/tmp/mysql/mysql.sock'

改完重新启动mysql的和蟒蛇终端

# 打开python交互模式进行测试

import MySQLdb

db = MySQLdb.connect("localhost","db_user","passwd","db_name")


# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# 使用execute方法执行SQL语句
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取一条数据
data = cursor.fetchone()
> 1

print('Database version : %s ' % data)

> Database version : 5.6.35

# 关闭数据库连接
db.close()

到此,MAMP + Python3整个流程走通,剩下的就是参照API写SQL了。:)

你可能感兴趣的:(python)