[技术博客]django连接mysql数据库的方法及部分问题的解决方法

配置机器介绍

操作系统: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。

上一篇:iOS开发学习-类似微信聊天消息中的电话号码点击保存到通讯录中的功能


下一篇:鸟哥的linux私房菜学习记录之档案权限与目录配置