[技术博客]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。
[技术博客]django连接mysql数据库的方法及部分问题的解决方法的更多相关文章
- 3.django连接mysql数据库及安装mysqldb驱动报错解决办法
1.在setting.py设置连接数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'djang ...
- [技术博客] Django中文件的保存与访问
[技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...
- 红眼技术博客 » redis连接池红眼技术博客 » redis连接池
红眼技术博客 » redis连接池 redis连接池
- Django 连接mysql数据库中文乱码
Django 连接mysql数据库中文乱码 2018年08月25日 20:55:15 可乐乐乐乐乐 阅读数:566 版本:CentOS6.8 python3.6.4 django1.8.2 数据库 ...
- django连接mysql数据库以及建表操作
django连接mysql数据库需要在project同名的目录下面的__init__.py里面加入下面的东西 import pymysql pymysql.install_as_MySQLdb() 找 ...
- Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?'
Python3:Django连接Mysql数据库时出错,'Did you install mysqlclient or MySQL-python?' 一.原因 因为Python版本问题,MySQLdb ...
- Python3之Django连接mysql数据库
一.mysql服务器 系统版本:CentOS6.8 IP :10.0.0.51 版本 1.授权root远程登录 grant all on *.* to 'root'@'%' identifide by ...
- Django 连接 MySQL 数据库及常见报错解决
目录 Django 连接 MySQL数据库及常见报错解决 终端或者数据库管理工具连接 MySQL ,并新建项目所需数据库 安装访问 MySQL 的 Python 模块 Django 相关配置 可能会遇 ...
- Django连接MySQL数据库配置
1.自己手动创建数据库 create database 数据库名; # 如: create database bms character set utf8; # 授权访问: grant all pri ...
随机推荐
- 锤子剪刀布pat-1018
题目描述 大家应该都会玩“锤子剪刀布”的游戏:现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入描述: 输入第1行给出正整数N(<=105),即双方交 ...
- 【转载】C#通过Copy方法快速复制DataTable对象
C#中的Datatable数据变量的操作过程中,可以通过DataTable的Copy方法快速复制当前的DataTable变量到新对象中,复制数据包含当前DataTable的结构信息如列名,同时也包含当 ...
- 92.vue---新手从本地项目开发到服务器线上运行爬坑。
因为我做的是后台,所以不用做SEO 参考 本项目的定位是后台集成方案,不太适合当基础模板来进行二次开发.因为本项目集成了很多你可能用不到的功能,会造成不少的代码冗余.如果你的项目不关注这方面的问题,也 ...
- Java 之 lambda 表达式
一.函数式编程思想概述 在数学中,函数就是有输入量.输出量的一套计算方案,就是“拿什么东西做什么事情”.相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语 ...
- PL/SQL 出现死锁解决办法
转自:https://blog.csdn.net/u013015629/article/details/48005763 在PL/SQL中操作数据表时,长时间没反应,并且编辑某个表中数据时,出现“re ...
- 几种线程相关的map介绍
Java中平时用的最多的Map集合就是HashMap了,它是线程不安全的. 看下面两个场景: 1.当用在方法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不 ...
- SaltStack--使用salt-ssh
SaltStack使用salt-ssh模式 salt-ssh 介绍 参考官档 salt-ssh是 0.17.0 新引入的一个功能,不需要minion对客户端进行管理,也可以不需要master:salt ...
- Android 还可以走多久?
最近,有位知识星球的球友问我这么一个问题: 我做 Android 开发五年多时间了,但是最近总是很焦虑,看着人工智能越来越火,很担心 Android 要不行了,想问下,我现在要转行么?Android ...
- python应用-猜数字游戏
import random def main(): answer = random.randint(1, 100) counter = 0 while True: counter += 1 numbe ...
- 12、Python函数高级(命名空间、作用域、装饰器)
一.名称空间和作用域 1.命名空间(Namespace) 命名空间是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的. 命名空间提供了在项目中避免名字冲突的一种方法.各个命名空 ...