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、常见问题
来源:CSDN
作者:无魂冬冬
链接:https://blog.csdn.net/Y_winter_w/article/details/103479459