之前学习了Django中的请求和响应方式,这次我们要学习Django中的ORM数据库框架;
日常工作中可能会遇到各种数据库,比如MySQL、oracle、mangodb、redis、sql server、db2、sqlite等等
1、回顾下pymysql第三方库如何从mysql数据库中获取数据:
a.安装pymysql模块
b.创建连接对象(添加配置)
c.创建游标对象
d.使用游标对象执行sql语句
e.获取执行结果(数据)
f.关闭游标
g.关闭连接
2、直接使用pymysql模块操作数据库,有什么痛点?
a.写sql语句非常困难
b.sql语句可能效率比较低
c.sql语句可能会有安全漏洞
d.操作数据库过程复杂
3、数据库的结构
a.一个mysql数据库管理软件中,可以有多个数据库
b.一个数据库里,可以有多张表
c.一张表里,可以有多个字段
d.一张里,可以有多个记录
一个数据库==一个配置
一张表 == 一个类
多个字段 === 一个类中多个属性
多个记录 == 一个类的多个实例对象
配置数据库信息
这里我们使用sqllite3数据库来练习,接下里进行配置
pycharm编译器中添加数据库
点击右侧的database-->点击”+“-->鼠标悬停在Data Source上-->选择SQLite
Name:设置数据库名称
File:设置sqlite的执行文件(db.sqlite3)路径
点击Test Connection 可以测试下是否连接成功,点击apply和OK即可。
配置全局配置表信息
在全局配置问价setting.py中的DATABASES中配置相应的数据库信息:
DATABASES = { # a.可以在DATABASES字典中添加数据库配置 # b.子字典中的key值为数据别名,default为默认别名 # c.value为具体的数据配置信息 'default': { # d.指定数据库引擎,可以添加.mysql、.oracle、.sqlite3等 # 'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.sqlite3', # e.指定数据库名称,如果使用sqlite3数据库引擎,那么指定的是sqlite3数据库的路径 'NAME': BASE_DIR / 'db.sqlite3', # 'NAME': 'my_django', # 指定数据库用户名 # 'USER': 'keyou', # 指定数据库用户密码 # 'PASSWORD': '123456', # 数据库主机地址(ip或者域名) # 'HOST': '111.122.21.1', # 指定数据库的监听端口,默认为3306 # 'PORT': 3306 } }
所以说,如果需要用到多个数据库的话,比如多个关系型数据库就需要在DATABASES里添加一个数据库配置。
创建模型类对象
鉴于数据库不同的表字段有些事相同的,所以可以单独提出来封装一个公共类
base_model.py
from django.db import models class BaseModel(models.Model): """" 数据库公共字段 """ create_time = models.TimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间") update_time = models.TimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间") class Meta: abstract=True verbose_name="公共字段表" db_table="BaseModel"
说明:
- 定义类属性
- 定义Field对象作为类属性,那么一个类属性对应数据表中的一个字段
- 默认会生成一个名为id的自增主键字段
- models.CharField指定创建的字段为字符串类型,必须得传递max_length最大尺度
- models.IntegerField指定创建的字段为int整数类型
- verbose_name和help_text关键字参数,指定字段的中文注释(说明)信息,一般在后台管理站点、api接口文档平台中有应用
- unique指定是否唯一,默认为False,如果设置为True,那么该字段不能重复设置
- 可以使用primary_key=True,指定该字段为主键,一张表中往往只有一个主键,只要设置了primary_key=True,那么ORM框架,不会自动添加名称为id的主键
- 在日期和时间相关字段中,可以添加auto_now_add或者auto_now
- auto_now_add指定在数据第一次创建时,自动添加创建的日期,以后更新数据记录之后,不会修改该字段
- auto_now指定数据在每一次修改(更新)时,自动设置修改那一刻的时间
- 一定要继承models.Model父类或者models.Model子类
- 一个模型类,对应一张表
- 模型类的内部类Meta:
- 如果没有设置内部类的相关信息:
- 生成的默认表名为子应用名_模型类敏感小写
- 设置abstract=True
- 指定该模型类为抽象模型类,在迁移时不会创建该表
- 仅用于被其他类继承
需要在对应的子应用projects下面的views.py文件里创建模型类对象
from django.db import models # Create your models here. from utils.base_model import BaseModel class ProjectsModel(BaseModel): id = models.AutoField(primary_key=True, verbose_name="id主键", help_text="id主键") name=models.CharField(max_length=200,verbose_name="项目名",help_text="项目名") leader=models.CharField(max_length=20,verbose_name="负责人",help_text="负责人") tester=models.CharField(max_length=20,verbose_name="测试",help_text="测试") programmer=models.CharField(max_length=50,verbose_name="开发人员",help_text="开发人员") publish_app=models.CharField(max_length=100,verbose_name="发布应用",help_text="发布应用") desc=models.TextField(max_length=200,verbose_name="简要描述",help_text="简要描述",blank=True,null=True,default="") class Meta: db_table = 'tb_projects' verbose_name = '项目信息' verbose_name_plural = verbose_name def __str__(self): # a.必须返回一个字符串类型 # b.在打印模型类对象时,会自动调用 return self.name
- 修改表信息
- class Meta:
- 定义Meta内部类,Meta类名固定
- db_table:
- 是给该模型类对象对应的数据库表起的别名;
- verbose_name与verbose_name_plural:
- 指定表的中文注释(说明)信息,一般在后台管理站点、api接口文档平台中有应用
接下来进行数据库的迁移:
进行迁移:
a.生成迁移脚本:在虚拟环境中,项目根目录下,使用python manage.py makemigrations 子应用名称
b.执行迁移脚本:使用python manage.py migrate 子应用名称
c.如果不添加子应用名,那么会对所有的子应用(settings.py INSTALLED_APP列表中注册的所有子应用)进行迁移
d.如果添加子应用名,那么会对添加的子应用名进行迁移
3python manage.py sqlmigrate 子应用名,查看原生 sql语句
迁移后就是看到数据库中的对应表结构