macOS下Django配置mysql,无法安装mysqlclient的问题

最近跟着学校与企业合作的课程学习了Django,再一次理解MVC,真是感慨良多,打算先记录一些问题,至于整个学习过程的记录这个坑等毕业论文搞掂后慢慢填上。

上课老师使用的环境是win32的python3.6.x和Django 2.x。我个人的环境是macOS High Sierra的python3.4.3和Django 2.x。DBMS使用mysql,配置数据库的时候遇到一些问题。主要的是无法安装mysqlclient这个py第三方库。开发环境都使用vscode。

从Django数据库配置过程说起吧,并附上解决bug时所走过的弯路:

一、使用命令行操作mysql的路径问题。

首先是在mysql下创建数据库,流程不多说,具体的自己百度即可。如果是使用iTerm和oh-my-zsh的同志中间可能会有一个小bug,就是即使安装好了mysql,iTerm老是说找不到路径,其实用自带的terminal也一样,网上有教程说在进入mysql时应当这么操作:

1 PATH="$PATH":/usr/local/mysql/bin
2 mysql -u root -p

理论上来说第一句是加入路径,但其实,,,,并不其作用,不行你退出terminal或iTerm后再进入,输入 echo $PATH 试试。既然加入路径软的办法不吃,就吃硬的办法,直接打开并修改对应的配置文件。参考文章点击这里

  • 自带terminal的路径文件在 ~/.bash_profile ,在末尾追加一句 export PATH=$PATH:/usr/local/mysql/bin/; 即可。
  • iTerm+zsh的路径文件在 ~/.zshrc ,在末尾追加同样的语句即可。

之后想通过命令行操作mysql的话就可以省略第一句加入路径的语句了。

其实可以测试一下,退出命令行窗口后再进入,然后输入通过 echo $PATH 看看路径,你会发现路径加入成功了。

二、创建数据库。

打开terminal或iTerm,输入 mysql -u root -p ,输入密码后进入mysql的操作。

之后就是正常的mysql语句操作啦,记得每句语句要以分号(;)结尾,这是sql语句的语法。

create database aisystem; --创建名为aisystem的数据库
use aisystem; --进入数据库

三、配置Django,无法安装mysqlclient的问题。

1、 在models.py里创建实体类

1 # 实体类
2 class TUser(models.Model):
3     userId = models.AutoField(primary_key=True, unique=True) # 自增,主键一般自增
4     username = models.CharField(max_length=50) # 必须指定最大程度,默认varchar
5     password = models.CharField(max_length=50)

2、在setting.py设置DATABASES属性

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'aisystem', # 已经建好的数据库名
        'USER': 'root',
        'PASSWORD': 'abc',
        'HOST': '127.0.0.1',
        'PORT': 3306,
    }
}

这里ENGINE默认是sqlite的,在此修改成mysql,Django2.x提供的数据库引擎只有4种,参考官方文档

3. 创建映射和表

这就ORM的优势就发挥出来了,我们使用Django来创建映射和数据库的表,这样能快速创建表并与实体类一一映射。

在vscode打开终端(快捷键:control + ~)输入命令: python3 manage.py makemigrations ,这是创建映射,效果。。。。我忘了截图了,反正会提示成功,不成功的话按照提示操作解决bug吧。而且项目里会多了一个文件夹magration如图: 

之后通过Django直接在数据库中创建表。命令如下: python3 manage.py migrate ,这是会提示没有数据库引擎对应的py库,是否需要安装mysqlclient。正常来说使用 pip3 install mysqlclient 就行了,问题是在这个环境下竟然有如下提示:

Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/qq/wfb_clcj46bg5zm_p6vf_wbw0000gn/T/pip-build-_g_2al4o/mysqlclient/

 这时到mysqlclient的GitHub上找解决办法以及它提示的mysql的bug反馈网中按照他们的操作解决也是不行的。

可能会想到直接下载源码然后使用 python3 setup.py install 但是会报出这样的bug:

所以这个方法也是不行的。

四、最后的解决办法。

这么去想,实际上也不一定要用mysqlclient这个第三方库来操作数据库。对于mysql这种老牌的开源DBMS(虽然这几年的遭遇挺惨的),python对它的操作肯定不止一个库。实际上从PyPi网上我们可以了解到,这个库经历了变迁,现在它的爸爸是PyMySQL了,所以我们大可以直接装PyMySQL pip3 install pymysql ,安装过程很顺利。

这时我们再试试 python3 manage.py migrate ,还是会报错:

但是细看报错会发现,它是找不到这个链接的模块,因为Django默认使用的模块名和我们装的不一样,这时候其实按照提示,点击(按下command再点击就能跳转)对应的py文件修改模块名即可。上面的截图报错挺长的,这里只是截取部分而已,需要修改的文件在后面,这里没有截图对应的报错提示。

大体来说是两个文件,反正修改完一个后,再运行,再提示,就能找到下一个需要修改的文件。实际上这些模块就是根模块名字不一样而已,子名字都一样,所以直接修改就好了。使用查找功能查找mysqlclient,然后替换成我们所装的pymysql即可。图中只是部分要修改的(我印象中不算注释,要修改的地方有5、6处吧)修改完后再次执行 python3 manage.py migrate ,就创建成功了。提示如下:

查看数据库就会发现多了这些表:

总得来说还是要善用报错提示吧,我跟人觉得像python这种解析型语言的报错比编译型的要友好得多。

另外给我的感觉mysql在mac平台下就是bug挺多的(相对其他成熟的软件来说),我想作为一个老牌的开源dbms,不应该配置起来这么麻烦,可能是我功力还不够吧。现阶段够用就行,不够再继续学。

原文地址:https://www.cnblogs.com/LittleSec/p/8854862.html