Django自带的数据库是SQLite,而我对MySQL熟一些,所以还是让Django用MySQL数据库吧。Python版本方面,我虚拟机Ubuntu16.04上用的是Python3.5,阿里云Ubuntu14.04用的是Python3.4。
这就带来了一个问题:Django中连接数据库的模块MySQLdb不支持Python3,我们还需要找替代方法来连接MySQL。
1. Python3中连接MySQL的替代方法
百度、谷歌可以发现pymysql模块是最常见的替代方法。参考http://stackoverflow.com/questions/4960048/python-3-and-mysql。里面的采纳答案列举了很多替代方法,其中mysql-connector-python是oracle官方支持的模块,但是与MySQLdb不兼容让我有点担心。Django源码中应该有很多地方都用到MySQLdb,不兼容的话可能会出问题。而pymysql能够“almost completely”兼容MySQLdb,这是它最大的优点。
(1) 安装pymysql
pip3 install PyMySQL
在阿里云上pip3下载失败,只能下载pymysql源码进行安装了。去pypi搜pymysql,注意不要用pymysql3(pymysql3的页面已经提示DO NOT USE THIS. PyMySQL support Python 3 already.),而是用pymysql。下载到任意一个地方,解压,python3 setup.py install就行了。
(2) Django项目中设置__init__.py
我对Python也是一知半解,所以也不太清楚__init__.py的作用。
原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml 导入 dom )的时候,实际上导入了它的 __init__.py 文件。
一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。
总之,我暂且将__init__.py理解为这个Django项目中执行初始化的脚本,它是先于其他脚本、程序执行的。
在Django项目目录下有个与项目同名的目录,里面就有__init__.py。一般而言,它是空的,我们只需加上:
import pymysql
pymysql.install_as_MySQLdb()
这样,在一开始我们就使用了pymysql来替代了MySQLdb。
2. 将Django项目数据库改成MySQL
这个没啥好说的。在setting.py找到DATABASES这一块,就这样改:
当然,NAME就是数据库名字咯,自己先创建一个数据库吧。比如创建一个叫mydb的数据库:create database mydb default charset utf8 collate utf8_general_ci;
准确地说,1-1安装pymysql是创建Django项目前就应该做的,1-2和2都是在配置每个Django项目要做的。
就酱。