Django:ORM是什么?字段类型、定义数据表、优缺点、CURD ? 蔚落 2023-01-14 03:00 97阅读 0赞 **目录** Django之ORM模块详解 1. 什么是 ORM? 2. Django 定义数据表 1) 模型类 2) 定义数据表 3. ORM 两种插入数据方式 1)插入数据方法1: 2)插入数据方法2: 4. ORM 增删改查——CURD 操作 5. ORM 优缺点 1)优点 2)缺点 -------------------- # Django之ORM模块详解 # ## 1. 什么是 ORM? ## **ORM (Object Realtional Mapping)**即**对象关系映射**,它是一种**基于关系型数据库的程序技术**。 * ORM **允许你使用类和对象对数据库进行操作**,这大大提高了对数据库的控制,避免了直接使用 SQL 语句对数据库进行操作。 * 这种程序技术的底层主要是**通过映射机制实现**的! * Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。 * 由于 Django 中 ORM 的存在,为我们操作不同种类的数据库提供了统一的方法,**ORM 适配了多种常用的关系型数据库,例**如 PostgreSQL、MySQL、Oracle、Sqlite3 等。 ![图1 ORM与DB映射][1 ORM_DB] 图1:ORM与DB映射关系图 如图1是 ORM 与数据库的映射关系图。ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到 SQL、SQL 到对象转换过程。 **Django 把表模型定义为 Model,他需要继承自`django.db.models`中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。**同时ORM 对于数据库的的增删改查,也提供了一些简单的 API,例如 F 查询、Q 查询。 针对数据库中的**字段类型**,Django ORM 都有对应的 “xxxField” 来表述,见如下表格。 <table> 字段类型表 <tbody> <tr> <th>字段</th> <th>说明</th> <th>字段属性</th> </tr> <tr> <td>AutoFiled</td> <td>默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。</td> <td> </td> </tr> <tr> <td>CharFiled</td> <td>字符类型</td> <td>Max_length=32,字符长度需要明确</td> </tr> <tr> <td>IntgerFiled</td> <td>整型 int</td> <td> </td> </tr> <tr> <td>DateFiled</td> <td>年月日时间类型</td> <td>auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。</td> </tr> <tr> <td>DateTimeFiled</td> <td>年月日小时分钟秒时间类型</td> <td>auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。</td> </tr> <tr> <td>DecimalFiled</td> <td>混合精度的小数类型</td> <td>max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。</td> </tr> <tr> <td>BooleanFiled</td> <td>布尔字段,对应数据库 tinyint 类型数据长度只有1位。</td> <td>值为True或False</td> </tr> <tr> <td>TextFiled</td> <td>用于大文本</td> <td> </td> </tr> </tbody> </table> 上表中列举了经常用到的**字段类型,**后续如果涉及到其它字段类型再进行介绍。 -------------------- ## 2. Django 定义数据表 ## 在 Django 中如何使用 ORM 模块来定义一张数据表呢?在定义数据表之前,我们应该首先理解什么是模型类。 ### 1) 模型类 ### 其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做**模型类** ,它是由 django.db.models.Model 派生出的子类,在 Django 中模型类是数据交互的接口,一个模型类代表数据库中的一张数据表,模型类中每一个类属性都代表数据表中的一个字段。 通过上述介绍,我们可以这样理解**:Django 中模型类就相当于 ORM 模块**。 ### 2) 定义数据表 ### 现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下: 1. from django.db import models 2. class UserInfo(models.Model): 3. name = models.CharFiled(max\_length=100) 4. password = models.CharFiled(max\_length=100) 通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析: * 第 1 行,使用 from django.db import models 导入 models 模块; * 第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类; * 第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。 -------------------- ## 3. **ORM 两种插入数据方式** ## 那么应该怎样对数据表进行操作呢? ### 1)插入数据方法1: ### 我们可以直接使用类名(即数据表名)来插入数据,代码如下: * UserInfo.objects.create(name='jay',password='abc123') 代码插入一条名字是“jay”,密码是“abc123”的数据。读到这里,您可能会对“ objects ”产生疑问,所以在此处讲解一个重要的概念:每个继承自 `models.Model` 的模型类,都会有一个 objects 对象被同时继承下来,这个对象就叫做“管理器对象”,数据库的增删改查可以用 objects 管理器对象来实现。 ### 2)插入数据方法2: ### 创建 UserInfo 的实例对象,然后调用`save()`方法保存,代码如下: * Obj=UserInfo(name="jay",password="abc123") * Obj.name="john" * Obj.save() 上述代码中 name 属性值会被赋值为“john”,最后调用 `save()`方法保存。 -------------------- ## 4. ORM 增删改查——**CURD 操作** ## **ORM 的增删改查**称为 **CURD 操作**,下面列举几个常用语句: * UserInfo.objects.all()\#查询表中的所有记录 * UserInfo.objects.filter(name\_contains='j')\#查询表中name含有“j”的所有记录,被使用较多 * UserInfo.objects.get(name="john")\#有且只有一个查询结果,如果超出一个或者没有,则抛出异常 * UserInfo.objects.get(name="john").delete()\#删除名字为john的记录 * UserInfo.objects.get(name="john").update(name='TOM')\#更新数据表的name为TOM -------------------- ## 5. ORM 优缺点 ## ### 1)优点 ### * 使用该模块只需要面向对象编程,不需要面向数据库编写代码,对数据库的操作转换为对类属性和方法的操作,不用我们编写各种数据库的 SQL 语句。 * 实现数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异化,不在关注不同数据库内部的操作细节,通过简单更改配置就可以实现数据库的更换而无需更改代码。 ### 2)缺点 ### * 相比直接用 SQL 语句操作数据库会有性能损失,因为在映射的过程中 ORM 需要与 SQL 之间进行转换,根据对象的操作转换成 SQL 语句,根据查询结果转换成对象,所以在映射的过程存在性能损失。 但是 ORM 的不足带来的这点性能损失是微不足道的,ORM 的优势还是非常突出的。因为这种对象模型和关系型数据库之间的转换方式,给开发者带来了极大的便捷,所以其它语言开发的框架,对 ORM 也有很多应用,比如 Hibernate、IBATIS、EclipseLink 等。 [1 ORM_DB]: /images/20221022/54567594f72d4a3ebbac87c7faa9f1fa.png
还没有评论,来说两句吧...