django网页制作(3)django中mysql数据库驱动安装、连接

  • Post author:
  • Post category:mysql

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 即可。 
如图: 


版权声明:本文为sjpljr原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。