1、基于DjangoTest项目演练
2、已经安装了mysql驱动,若未安装可以执行安装命令:pip install pymysql
3、已在navicat手动创建了数据库order_test(由于Django自带的orm是data_first类型的ORM,使用前必须先创建数据库)
4、其他说明
Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架,到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞:
- 创建数据库,设计表结构和字段
- 使用 MySQLdb 来连接数据库,并编写数据访问层代码
- 业务逻辑层去调用数据访问层执行数据库操作
ORM:Object Relational Mapping(关系对象映射)
类名对应------》数据库中的表名
类属性对应---------》数据库里的字段
类实例对应---------》数据库表里的一行数据
二、修改setting.py在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为如下:
DATABASES = { 'default': { #'ENGINE': 'django.db.backends.sqlite3', #'NAME': BASE_DIR / 'db.sqlite3', #修改DATABASES 配置项 'ENGINE': 'django.db.backends.mysql', # 数据库引擎 'NAME': 'order_test', # 数据库名称 'HOST': '12.18.20.42', # 数据库地址,本机 ip 地址 127.0.0.1 'PORT': 13306, # 端口 'USER': 'doud', # 数据库用户名 'PASSWORD': 'cNiryBWa', # 数据库密码 } }三、修改__init__.py
告诉 Django 使用 pymysql 模块连接 mysql 数据库,设置 Django默认连接MySQL的方式
# 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置 import pymysql pymysql.install_as_MySQLdb()四、定义模型 1、创建APP
Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app
django-admin startapp TestModel2、修改 TestModel/models.py 文件,创建表
类名Test代表了数据库表名,且继承了models.Model,类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。
注:说通俗点,就是name字段是创建表时要定义的字段
from django.db import models # Create your models here. class Test(models.Model): name = models.CharField(max_length=20)3、修改 DjangoTest/settings.py
在 settings.py 中找到INSTALLED_APPS这一项,修改如下,即注册APP:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'TestModel', #添加此项 ]4、执行创建表结构的命令
只要模型文件models.py进行了内容的更新,我们都会使用python manage.py makemigrations 和 python manage.py migrate这两个命令
1)python manage.py makemigrations TestModel当我们第一次在models.py文件新建model类(一个类对应数据库中的一张数据表)时,执行python manage.py makemigrations 命令之后,应用目录下的migations的文件下多了一个001的文件。文件内容记录了我们刚才在medels.py文件的操作
2)python manage.py migrate TestModel执行了第1步的命令后,数据库里是没有TestMode_test模型的表的,此时要再执行python manage.py migrate,刷新数据库可以看到新建好的数据表,数据表中字段也出现了
下图是表结构,表名组成结构为:应用名_类名(如:TestModel_test)
注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。
3)问题:两个命令的关系?可以只执行其中一个命令吗?答案:首先,第一个命令的作用是记录即将要做的数据库操作,但实际上并没有进行数据库操作。第二个的命令的作用是对数据库进行操作(建表、改表等)
综上:python manage.py makemigrations命令记录对models文件的修改。python manage.py migrate命令在数据库中创建表和数据
五、数据库操作 1、编辑TestModel/tests.py直接用现有的tests.py文件实战演练就行了,懒得再创建多1个文件。
tests.py源码如下,包含:1)添加数据:需要先创建对象,然后再执行 save 函数,相当于SQL中的INSERT;2)获取数据
from django.test import TestCase # Create your tests here. # -*- coding: utf-8 -*- from django.http import HttpResponse from TestModel.models import Test # 数据库操作:添加数据 def testdb(request): test1 = Test(name='lijun') test1.save() return HttpResponse("<p>数据添加成功!</p>") # 数据库操作:获取数据 def querry(request): # 初始化 response = "" response1 = "" # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM list = Test.objects.all() # filter相当于SQL中的WHERE,可设置条件过滤结果 response2 = Test.objects.filter(id=1) # 获取单个对象 response3 = Test.objects.get(id=1) # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2; Test.objects.order_by('name')[0:2] # 数据排序 Test.objects.order_by("id") # 上面的方法可以连锁使用 Test.objects.filter(name="runoob").order_by("id") # 输出所有数据 for var in list: response1 += var.name + " " response = response1 return HttpResponse("<p>" +"查询数据库返回的数据为:"+ response + "</p>")2、修改DjangoTest/urls.py
from django.contrib import admin from django.urls import path from DjangoTest import views from TestModel import tests urlpatterns = [ path('admin/', admin.site.urls), path('123/',views.student),# 访问视图的student对象,student对象指向的是HelloWorld.html path('122/',views.hello) ,# 访问的是视图的hello对象,hello对象使用的是HttpResponse直接返回的值 path('111/',tests.testdb), # 访问的是TestModel应用的tests文件下的testdb对象 path('112/',tests.querry) # 访问的是TestModel应用的tests文件下的querry对象 ]3、浏览器访问 1)访问添加数据的地址 http://127.0.0.1:8000/111/
如下图,访问后返回数据添加成功,此时数据库表会insert一条数据
2)访问获取数据的地址http://127.0.0.1:8000/112/
以上便讲述完成如何使用mysql数据库,至于更新或删除数据,可参考https://www.runoob.com/django/django-model.html,这里不再演示了