配置机器介绍
操作系统:Ubuntu 18.04.2 LTS 64位
python版本:Python 3.6.7
Django版本:Django 2.2
MySql版本:5.7.26
数据库选择
我们在使用Django进行小程序后端开发和测试的时候,是直接使用SQLite作为数据库。SQLite是一个基于文件的轻量级数据库,功能简约,小型化,追求最大磁盘效率,但是SQLite数据库同一时间只允许一个写操作,因此吞吐量有限,并不适合多用户并发访问;而MySQL支持高并发的访问,而且相对于SQLite,MySQL性能更好,使用人数更多,相关的教程也更加完善,更适合在生产环境中使用,因此我们选择MySQL作为后端的数据库。
安装MySQL
在ubuntu 1804服务器上安装MySQL的过程主要参考了How To Install MySQL on Ubuntu 18.04这篇教程。
在MySQL5.7以及之后的版本中,为了提高安全性,默认使用auth_socket
插件来替代密码认证root用户,所以无法直接为root用户设置密码,root用户也无法使用密码登录。如果需要为root用户设置密码,可以通过以下命令将root用户的认证插件从 auth_socket
改为mysql_native_password
:
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'very_strong_password';
mysql> FLUSH PRIVILEGES;
具体过程可以参考这里。
安装好MySQL之后需要还需要新建一个数据库以及对应的用户来供Django项目使用。
Django连接MySQL
通过修改Django项目的settings.py
配置文件将Django的数据库由sqlite改为MySQL:
# settings.py文件
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'read_default_file': '/path/to/my.cnf',
},
}
}
# my.cnf文件
[client]
database = DATABASE_NAME
user = USER
password = PASSWORD
default-character-set = utf8
安装mysqlclient
将Django的数据库由sqlite改为MySQL之后,需要执行以下命令在数据库中生成相应的数据表:
python3 manage.py makemigrations
python3 manage.py migrate
执行时发生以下错误:
Traceback (most recent call last):
File "/home/ubuntu/.local/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 15, in <module>
import MySQLdb as Database
ModuleNotFoundError: No module named 'MySQLdb'
...
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
通过提示信息和查阅Django文档得知需要安装一个驱动库来连接MySQL数据库。使用较多的驱动库有MySQL-python(MySQLdb),pymysql以及mysqlclient等,由于MySQL-python目前还不支持python3,而mysqlclient基于C语言实现,且完全兼容MySQLdb,速度要优于基于python实现的pymysql(参考How can I connect to MySQL in Python 3 on Windows?),而且是Django官方推荐的驱动库,所以我们选择安装mysqlclient。
通过pip进行安装mysqlclient:
sudo pip3 install mysqlclient
安装时遇到如下错误:
Complete output from command python setup.py egg_info:
/bin/sh: 1: mysql_config: not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-4zmu2e7d/mysqlclient/setup.py", line 16, in <module>
metadata, options = get_config()
File "/tmp/pip-build-4zmu2e7d/mysqlclient/setup_posix.py", line 51, in get_config
libs = mysql_config("libs")
File "/tmp/pip-build-4zmu2e7d/mysqlclient/setup_posix.py", line 29, in mysql_config
raise EnvironmentError("%s not found" % (_mysql_config_path,))
OSError: mysql_config not found
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-4zmu2e7d/mysqlclient/
通过查阅Stack Overflow上的问答pip install mysql-python fails with EnvironmentError: mysql_config not found得知需要在安装前执行以下命令安装对应的库:
sudo apt install libmysqlclient-dev python-dev
执行之后再重新安装即可成功安装mysqlclient。