Django 数据库配置(二)
动态连接数据库
动态连接数据库是为了在系统不中断的情况下切换到另一个数据库,因为在settings.py中配置数据库时,每次保存都会自动重启Django,在有用户正在使用时,这种操作会导致用户的数据丢失,为避免这种情况。可以将数据库的连接方式写到配置文件中,这样无需修改settings.py的配置就可以切换数据库的目的。
首先在项目目录下,创建配置文件mysql.cnf,然后在配置文件mysql.cnf中写入mysql数据库的连接信息,代码如下:
#mysql 数据库链接配置 [client] database = accent user = root password = root@123 host = 192.168.129.130 port = 3306 database = manage user = root password = root@123 host = 192.168.129.130 port = 3306
在Django的settings.py配置文件中,修改数据库连接读取配置文件的信息,代码如下:
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': BASE_DIR / 'db.sqlite3', # } #读取数据库配置文件中的数据库连接信息 "default":{ "ENGINE":"django.db.backends.mysql", "OPTIONS":{"read_default_file":str(BASE_DIR / "mysql.cnf")}, } }
验证mysql.cnf配置文件是否能访问数据库,在项目的urls.py中设置路由index,且路由视图函数indexView(),代码如下:
from django.contrib import admin from django.urls import path,re_path from myapp.views import index urlpatterns = [ path('admin/', admin.site.urls), path("",index), ]
在视图中读取数据库信息,并打印到页面上:
from django.shortcuts import render from django.contrib.contenttypes.models import ContentType # Create your views here. def index(request): c = ContentType.objects.values_list().all() content = {} content["dbinfo"] = c return render(request,"index.html",content)
修改index.html模板内容,显示数据库信息
<html lang="en"> <head> <mete charset="utf-8"></mete> <title>hello word</title> </head> <body> <p>{{dbinfo}}</p> </body> </html>
启动Django之前,需要新创建数据库表,在项目路径下,执行以下命令:
python manage.py migrate
启动Django服务:
python manage.py runserver 8000
在浏览器中访问服务器地址:https://127.0.0.1:8000
问题:在python manage.py migrate 时会报django.db.utils.OperationalError: (1045, "Access denied for user 'Administrator'@'localhost' (using password: NO)")
将数据库配置信息打印出来,参数配置没有问题,但是貌似没有读取数据库配置文件的内容,如下:
解决方式:后面网上找到一篇帖子:https://code.djangoproject.com/ticket/24653
在settings.py配置文件中,导入io模块,在数据库配置中引入io路径拼接,如下:
再将DATABASES改为:
"default":{ "ENGINE":"django.db.backends.mysql", "OPTIONS":{"read_default_file":os.path.join(BASE_DIR / "MyDjango/mysql.cnf")}, }
再次执行python mange.py migrate 就能创建数据库成功。