ORM框架
全名: 对象-关系-映射 (Object-Relational-Mapping 简称ORM)
本章内容基于Django框架引出, 不适者绕道
ORM模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象, 简单来说, 将程序中产生的数据持久化到关系数据库中, ORM提供了实现持久化层的一种模式,采用映射元数据来描述对象关系的映射, 使的ORM 中间件可能在任何一个应用的业务逻辑层和数据层之间充当桥梁.
Django 把表模型定义为 Model,他需要继承自django.db.models
中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。
同时ORM对数据的增删查改也提供了一些接口, 例如 F 查询 , Q 查询
针对数据库中的字段类型, Django ORM “XXXFiled” 见表如下:
字段 | 说明 | 字段属性 |
---|---|---|
AutoFiled | 默然自增主键(Primary_key=Ture), Django 默认建立id字段为主键。 | |
CharFiled | 字符类型 | Max_length=32,字符长度需要明确 |
IntgerFiled | 整型 int | |
DateFiled | 年月日时间类型 | auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。 |
DateTimeFiled | 年月日小时分钟秒时间类型 | auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。 |
DecimalFiled | 混合精度的小数类型 | max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。 |
BooleanFiled | 布尔字段,对应数据库 tinyint 类型数据长度只有1位。 | 值为True或False |
TextFiled | 用于大文本 |
熟悉ORM属性类型后, 加下来就是练手了(搭一个简单的登录页面, 主要体现连接数据库的方便)
完全使用对象处理数据库的存取
创建django项目
django-admin startproject First
创建app
python manage.py startapp app01
一. 在app01的models下建UserInfo类
from django.db import models
这里用到的属性在开头都已经介绍, 不懂返回顶上看
class UserInfo(models.Model):
设置表id字段
id = models.AutoField(primary_key=True)
名字字段
name = models.CharField(max_length=32)
密码字段
password = models.CharField(max_length=64,null=True)
性别字段
gender = models.ImageField(default=0)
省份字段
province = models.CharField(max_length=32,null=True)
类创建完成后需要执行两行代码 (本机数据库db.sqlite3, 不用下载, 运行两行代码后自动生成)
- python manage.py makemigrations
- python manage.py migrate
完成数据库建表字段
二. templates创建注册html文件(不多解释, 懂得自然懂)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
临时路径, 需要的自己下载, bootstrap官网
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
<title>注册</title>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-md-6 col-md-offset-3">
<h1 class="text-center">注册功能</h1>
<div class="panel panel-primary">
<div class="panel-heading">欢迎来到注册页面</div>
<div class="panel-body">
<form action="" method="post">
<div class="form-group">
<label for="">用户名</label>
<input type="text" name="name" class="form-control">
</div>
<div class="form-group">
<label for="">密码</label>
<input type="password" name="password" class="form-control">
</div>
<div class="form-group">
<label for="">性别</label>
<div class="radio">
<label>
<input type="radio" name="gender" value="1" checked>男
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="gender" value="2">女
</label>
</div>
</div>
<div class="form-group">
<label for="">省份</label>
<select class="form-control" name="province">
<option value="山东省">山东省</option>
<option value="江苏省">江苏省</option>
<option value="上海市">上海市</option>
<option value="浙江省">浙江省</option>
<option value="陕西省">陕西省</option>
</select>
</div>
<div class="text-center">
<input type="submit" value="注册" class="btn btn-danger">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
三. views文件下创建如下内容
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
def register(request):
判断请求状态
if request.method=="GET":
get请求返回注册页面
return render(request,"register.html")
elif request.method=="POST":
post请求把用户数据保存起来
rest = request.POST
获取用户数据
name = rest.get("name")
pwd = rest.get("password")
gender = rest.get("gender")
province = rest.get("province")
print(rest)
保存数据, 调用之前写的数据库接口类,
user = models.UserInfo(name=name,password=pwd,gender=gender,province=province)
必须调用save()属性, 否则不保存
user.save()
必须返回一个状态, 状态可以是一个页面
return HttpResponse("ok")
四. 路由配置
settings配置如下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"app01.apps.App01Config", //将app添加到这里
]
设置静态文件路径, 在最后位置
# 再配一个STATICFILES_DIRS=列表(列表内写路径),单词一个字母都不能错
STATICFILES_DIRS = [
os.path.join(BASE_DIR,"static"),
]
五. urls路由配置
urlpatterns = [
path('admin/', admin.site.urls),
path("register/",register)
]
ORM框架: 为了解决面向对象与关系数据库存在不匹配的现象.
ORM 框架的优缺点
优点:
使用该模块只需要面向对象编程, 不需要面向sql语句编程, 对数据库操作转换为对类属性操作, 不用我们编写各种SQL语句
实现数据模型与数据库解耦性, 屏蔽了不同数据库上的差异化操作, 不再关注数据库内部的细节操作, 通过更改配置就可以实现数据库的更换而无需更改代码
提高开发效率, 降低开发成本, 是开发更加对象化, 可移植, 很方便地引入数据缓存之类的附加功能
缺点:
相比直接使用SQL语句操作数据库会损失性能, ORM的优势还是非常突出的, 因为这种模型和关系型数据库之间的转方式, 让一些开发者逐渐遗忘原生SQL语句, 导致丧失SQL优化能力.