Django 数据库管理
Django数据库支持
Django支持连接多种数据库,除了默认的SQLite外,还包括MySQL、PostgreSQL和Oracle这些关系型数据库。
##注意事项
持久链接
在
setting
中设置
CONN_MAX_AGE
参数可以设置数据库连接保持的时间(秒),默认为0:每次请求(request)后关闭与数据库的链接;设置为None时:无限制的持续连接。
连接管理
Django在首次进行数据库查询时会打开与数据库的连接。它保持此连接打开并在后续请求中重用它。 Django一旦超过CONN_MAX_AGE定义的最时间或者不再可用,就会关闭连接。
在每个请求开始时,如果连接达到其最大时间,Django就会关闭连接。如果要设置数据库在一段时间后终止空闲连接,则应将CONN_MAX_AGE设置为一个较低的值,以便Django不会尝试使用已被数据库服务器终止的连接。 (此问题可能只会影响非常低流量的网站。)
在每个请求结束时,Django会关闭那些连接时间达到max_age或者处于不可恢复的错误状态的连接。如果在处理请求时发生任何数据库错误,Django会检查连接是否仍然有效,如果没有则关闭它。因此,数据库错误最多只影响一个请求;如果连接变得不可用,则下一个请求将获得新连接。
警告
由于每个线程都维护自己的连接,因此数据库必须支持至少与工作线程一样多的连接。
有时候,大多数视图都不会访问数据库,例如,因为它是外部系统的数据库,或者使用了缓存机制。这种情况下,需要将CONN_MAX_AGE设置为低值甚至为0,因为维护不太可能被重用的连接没有意义。这将有助于保持同时与数据库进行连接的数量。
开发服务器为它处理的每个请求创建一个新线程,会影响持久连接。在开发过程中不要启用它们。
当Django建立与数据库的连接时,它会根据所使用的后端设置适当的参数。如果启用持久连接,则不会再对每个请求重复此设置。如果修改连接的隔离级别或时区等参数,则应在每个请求结束时恢复Django的默认设置,在每个请求开始时强制使用适当的值,或者禁用持久连接。
编码
Django会默认所有的数据库都使用
utf-8
编码,如果使用了其他编码方式可能会导致意料之外的错误。
Django多数据库联用
大多数情况下,Django只需要使用一个数据库。但也可以指定同时使用多个数据库。
连接MySQL数据库
先试使用MySQL数据库代替默认的SQLite数据库,确保安装了MySQL。
-
下载
pymysql
库:
pip install pymsql
; - 在管理目录下的__init__.py中添加:
import pymysql
pymysql.install_as_MySQLdb()
让Django将pymysql当做MySQLdb使用
-
修改setting下的
DATABASE
设置,填写MySQL的用户、密码和要使用的数据库,使用非
root
用户还需指明
host
和
port
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ex1',
'USER': password.dbuser,
'PASSWORD': password.mysql_passwd,
'HOST':'localhost',
'PORT':'3306',
},
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# },
-
执行
migrate
命令
(venv) ulysses@ulysses:~/PycharmProjects/django_ulysses$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, djcelery, learning_logs, sessions, sites, users
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
MySQL数据库中就会有数据表。
使用PostgreSQL
需要安装psycopg2:
pip install psycopg2
或
pip install psycopg2-binary
。不建议几个不同的数据库一起使用。
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# },
'default':{
},
'learning_logs':{
'ENGINE':'django.db.backends.mysql',