B-02 Django-第二部分(熟练掌握)-模型(Model)设计-数据库配置(基础)

两盒软妹~` 提交于 2019-12-13 06:18:06

Django-第二部分(熟练掌握)-模型(Model)设计-数据库配置(基础)

目标

前面已经介绍了如何快速入门,现在开始熟练掌握一些知识

  • 知道在哪了进行数据库的配置并进行基本的配置
  • 了解配置过程中常见的问题

回顾

a、模型(Model)设计流程过程说明

第一步-配置使用数据库
第二步-定义模型类
第三步-迁移数据
第四步-访问使用数据

一、配置使用sqlite

Django支持SQLite 3.8.3及更高版本。

1.1、配置方法

说明:Django默认使用 SQLite,如果要使用其他数据库,需要修改对应配置文件
第一步:修改setting.py文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

配置说明:

  • ENGINE—对应数据库类型,如: Either ‘django.db.backends.sqlite3’, ‘django.db.backends.postgresql’,‘django.db.backends.mysql’, or ‘django.db.backends.oracle’. Other backends are also available
  • NAME—数据库的名称,如果使用的是SQLite,数据库将是已文件方式保存在电脑中。该字段,应该是绝对路径,包含文件名称。比如:
  • 如果使用的不是SQLite数据库,还需要添加其他字段,可以详见其他数据库配置。

1.2、常见问题

1.2.1、子串匹配和区分大小写

对于所有SQLite版本,在尝试匹配某些类型的字符串时会有一些稍微违反直觉的行为。在Querysets中使用iexact或contains过滤器时会触发这些 。行为分为两种情况:

  • 对于子字符串匹配,所有匹配都是不区分大小写的。这是一个filter(name__contains=“aa”)匹配名称的过滤器"Aabb"。
  • 对于包含ASCII范围之外的字符的字符串,即使将不区分大小写的选项传递给查询,也会区分大小写地执行所有精确的字符串匹配。因此,在这些情况下,iexact过滤器的行为与过滤器的行为完全相同exact。

sqlite.org中记录了一些可能的解决方法,但Django中的默认SQLite后端没有使用它们,因为合并它们相当困难。因此,Django公开了默认的SQLite行为,在进行不区分大小写或子串过滤时应该注意这一点。

1.2.2、“数据库被锁定”错误

SQLite意味着是一个轻量级数据库,因此不能支持高级别的并发性。错误表明您的应用程序遇到的并发性超过了默认配置中的处理能力。此错误意味着一个线程或进程对数据库连接具有独占锁定,而另一个线程超时则等待释放锁定。

OperationalError: database is lockedsqlite

Python的SQLite包装器有一个默认的超时值,它确定第二个线程在超时之前允许等待多长时间并引发错误。

OperationalError: database is locked

如果您收到此错误,可以通过以下方式解决:

  • 切换到另一个数据库后端。在某个时刻,SQLite对于真实世界的应用程序来说太“精简”了,而这些并发错误表明你已经达到了这一点。
  • 重写代码以减少并发性并确保数据库事务是短暂的。
  • 通过设置timeout数据库选项来增加默认超时值:
'OPTIONS': {
    # ...
    'timeout': 20,
    # ...}

这将使SQLite等待一段时间再抛出“数据库被锁定”错误; 它不会真正解决它们。

二、配置使用mysql

Django支持MySQL 5.6及更高版本。

2.1、配置方法

第一步:修改工程目录下的__init__.py 文件

import pymysql
pymysql.install_as_MySQLdb()

第二步:修改setting.py文件

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "XXXX",           # 要连接的数据库,连接前需要创建好
        'USER':'root',                # 连接数据库的用户名
        'PASSWORD':'XXXX',      # 连接数据库的密码
        'HOST':'localhost',         # 连接主机,默认本机
        'PORT':'3306',              #  端口 默认3306
    }
}

其他方式

# settings.pyDATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/path/to/my.cnf',
        },
    }}

# my.cnf
[client]
database = NAME
user = USER
password = PASSWORD
default-character-set = utf8

2.2、常见问题

问题一、No module named ‘MySQLdb’

错误提示
No module named 'MySQLdb'
问题原因

原因:python3连接MySQL不能再使用mysqldb,取而代之的是pymysql。

解决办法

在工程目录下的__init__.py 文件添加如下代码

import pymysql
pymysql.install_as_MySQLdb()

问题二、mysqlclient 1.3.3 or newer is required

错误提示
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None
问题原因

MySQLclient目前只支持到python3.4。

解决办法

因此如果使用的更高版本的python,需要修改对应文件mysql(可以通过错误提示确定问题文件),如下:通过查找路径C:\Programs\Python\Python36-32\Lib\site-packages\Django-2.0-py3.6.egg\django\db\backends\mysql 这个路径里的文件,把如下代码

if version < (1, 3, 3):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

注释掉 就OK了。

问题三、decode错误

对于我来说,还要更进一步修改 对应提示的operations.py。把其中的

query = query.decode(errors='replace')
# 修改为
query = query.encode(errors='replace')

三、配置使用Oracle

3.1、配置方法

要使用Oracle数据库的服务名称进行连接,您的settings.py 文件应如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.oracle',
        'NAME': 'xe',
        'USER': 'a_user',
        'PASSWORD': 'a_password',
        'HOST': 'dbprod01ned.mycompany.com',
        'PORT': '1540',
    }}

3.2、常见问题

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!