最近跟着学校与企业合作的课程学习了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的路径问题。
1 PATH="$PATH":/usr/local/mysql/bin
2 mysql -u root -p
理论上来说第一句是加入路径,但其实,,,,并不其作用,不行你退出terminal或iTerm后再进入,输入 echo 试试。既然加入路径软的办法不吃,就吃硬的办法,直接打开并修改对应的配置文件。参考文章点击这里。
- 自带terminal的路径文件在 ~/.bash_profile ,在末尾追加一句 export PATH=$PATH:/usr/local/mysql/bin/;
- iTerm+zsh的路径文件在 ~/.zshrc
之后想通过命令行操作mysql的话就可以省略第一句加入路径的语句了。
其实可以测试一下,退出命令行窗口后再进入,然后输入通过 echo
二、创建数据库。
打开terminal或iTerm,输入 mysql -u root -p
之后就是正常的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
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
所以这个方法也是不行的。
四、最后的解决办法。
这么去想,实际上也不一定要用mysqlclient这个第三方库来操作数据库。对于mysql这种老牌的开源DBMS(虽然这几年的遭遇挺惨的),python对它的操作肯定不止一个库。实际上从PyPi网上我们可以了解到,这个库经历了变迁,现在它的爸爸是PyMySQL了,所以我们大可以直接装PyMySQL pip3 install
这时我们再试试 python3 manage.py migrate ,还是会报错:
但是细看报错会发现,它是找不到这个链接的模块,因为Django默认使用的模块名和我们装的不一样,这时候其实按照提示,点击(按下command再点击就能跳转)对应的py文件修改模块名即可。上面的截图报错挺长的,这里只是截取部分而已,需要修改的文件在后面,这里没有截图对应的报错提示。
大体来说是两个文件,反正修改完一个后,再运行,再提示,就能找到下一个需要修改的文件。实际上这些模块就是根模块名字不一样而已,子名字都一样,所以直接修改就好了。使用查找功能查找mysqlclient,然后替换成我们所装的pymysql即可。图中只是部分要修改的(我印象中不算注释,要修改的地方有5、6处吧)修改完后再次执行 python3 manage.py migrate
查看数据库就会发现多了这些表: