lesson42\43——django中mysql数据库连接
一、mysql驱动程序安装
使用django操作mysql,实际上底层通过python进行操作。首先(在该项目python虚拟环境下)需要安装驱动程序。
1、暂仅支持python2驱动:mysql-python:即mysqldb(注意:django默认驱动,python3时不可用)。
2、python3的程序程序:pymysql(命令:pip install pymysql)、mysqlclient(安装命令:pip install mysqlclient等)。
3、mysql connector/python:mysql推出的使用纯python连接mysql驱动。
选择适当驱动,实现django具备mysql可以连接的软件基础。
二、项目settings.py文件设置
1、settings.py 文件头部:添加 # -*- coding: UTF-8 -*-;
2、其中数据库内容设置,具体根据实际情况变更,举例如下:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'zn_work',
'USER': 'root',
'PASSWORD': 'mysql',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
三、数据库连接常见问题
问题1、No module named ‘MySQLdb’
在pycharm中点击项目的运行按钮,提示如下:
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "E:\envs\myweb_sjp\lib\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?
(1)问题原因:Django连接MySQL时默认使用MySQLdb驱动,但MySQLdb不支持Python3。
(2)解决办法:将django的MySQL驱动设置为pymysql。操作步骤:
然后在工程文件__init__.py添加以下代码即可。
(2.1)虚拟环境中安装pymysql:pip install pymysql
如因pip版本低,提示如下:
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
pip._vendor.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
则首先升级pip版本:
执行命令:python -m pip install –upgrade pip;
或强制重新安装命令:python3 -m pip install –upgrade –force-reinstall pip;
或强制重新安装命令:python -m pip install -U –force-reinstall pip
或下载pip升级包,使用命令:easy_install [包名]
备注,升级其他包命令:pip install –upgrade [包名]
(2.2)项目__init__.py文件添加代码:
# coding=utf-8
import pymysql
pymysql.install_as_MySQLdb()
问题2:mysqlclient 1.3.13 or newer is required; you have 0.9.3.
File "E:\envs\myweb_sjp\lib\site-packages\django\db\backends\mysql\base.py", line 36, in <module>
raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
1、双击提示文字中的文件位置链接,找到虚拟环境中djangoq包中的base.py文件。例:E:/envs/myweb_sjp/Lib/site-packages/django/db/backends/mysql/base.py。
2、注释掉相关语句。
version = Database.version_info
# if version < (1, 3, 13):
# raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
# 将以上语句注释掉,不再运行即可。
3、此问题为pip install pymysql安装数据库驱动版本不满足要求所致。pip install –upgrade pymysql会提示,你已经安装0.9.3版本,不能解决问题。
问题3:AttributeError: ‘str’ object has no attribute ‘decode’
File "E:\envs\myweb_sjp\lib\site-packages\django\db\backends\mysql\operations.py", line 146, in last_executed_query
query = query.decode(errors='replace')
AttributeError: 'str' object has no attribute 'decode'
点击红框内蓝色链接,直接转到异常位置,将decode改成encode即可。
if query is not None:
query = query.encode(errors='replace')
return query
问题4:CommandError: Error: No database fixture specified. Please provide the path of at least one fixture in the command line.
去掉:Test server选项(只是原因之一)。
四、其他问题
数据库子窗口,观察数据库,配置如下:
解决步骤:
解决方法:位于pycharm界面下边状态栏左边图标切换状态或状态,将显示或隐藏pycharm界面左右侧工具栏。
将光标移到这个图标上,将显示各个 工具栏,点击将快速切换到相应的工具栏或子窗口上。如TODO、EventLog、Database等多个子窗口。
切换到Database工具栏及子窗口:
1、调Database工具及子窗口,点击Test Connection按钮,提示如下:
2、提示:Driver files are not configured。点击Switch to Latest Driver安装驱动。
3、安装驱动后,提示信息:java.lang.RuntimeException: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
4、调出Database窗口——Data sources and drivers——URL。将URL值改为:
jdbc:mysql://127.0.0.1:3306/zn_work?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
jdbc:mysql://127.0.0.1:3306/zn_work?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
URL中:jdbc:mysql://127.0.0.1:3306/zn_work,127.0.0.1为服务器IP地址,3306端口号,zn_work为数据库名。须根据自己具体情况设置。
URL中:?及其以后部分,通用。
经验证通过。
5、其他方法:没试用。
此问题为时区问题,在 JDBC 的连接 url 部分加上 serverTimezone=UTC 即可。
如图: