Orm对象关系映射

踩风火轮的乌龟 2020-04-30

ORM(Object Relational Mapping):对象关系映射,通过创建一个类与数据库的表相对应,类的对象代指数据库中的一行数据。让用户不再写SQL语句,而是通过类以及对象的方式,和其内部提供的方法,进行数据库操作。

功能:把用户输入的类或对象转换成SQL语句,转换之后通过pymysql执行完成数据库的操作。

优点:提高开发效率,降低开发成本;使开发更加对象化;可移植;方便地引入数据缓存之类的附加功能

不足之处:在处理多表联查、where条件之类的复杂查询时,ORM的语法会变得复杂,就需要写入原生SQL

面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。

简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。

ORM 把数据库映射成对象。

数据库的表(table) --> 类(class)

记录(record,行数据)--> 对象(object)

字段(field)--> 对象的属性(attribute)

举例来说,下面是一行 SQL 语句。

SELECT id, first_name, last_name, phone, birth_date, sex FROM persons WHERE id = 10

程序直接运行 SQL,操作数据库的写法如下。

res = db.execSql(sql);
name = res[0]["FIRST_NAME"];

改成 ORM 的写法如下。

p = Person.get(10);
name = p.first_name;

一比较就可以发现,ORM 使用对象,封装了数据库操作,因此可以不碰 SQL 语言。开发者只使用面向对象编程,与数据对象直接交互,不用关心底层数据库。

总结起来,ORM 有下面这些优点。

  1. 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
  2. ORM 有现成的工具,很多功能都可以自动完成,比如数据消毒、预处理、事务等等。
  3. 它迫使你使用 MVC 架构,ORM 就是天然的 Model,最终使代码更清晰。
  4. 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
  5. 你不必编写性能不佳的 SQL。

但是,ORM 也有很突出的缺点。

  1. ORM 库不是轻量级工具,需要花很多精力学习和设置。
  2. 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
  3. ORM 抽象掉了数据库层,开发者无法了解底层的数据库操作,也无法定制一些特殊的 SQL。

CRUD 操作

数据库的基本操作有四种:create(新建)、read(读取)、update(更新)和delete(删除),简称 CRUD。

ORM 将这四类操作,都变成了对象的方法。

6.1 查询

前面已经说过,find()方法用于根据主键,获取单条记录(完整代码看这里)或多条记录(完整代码看这里)。

// 返回单条记录
// demo02.js
Customer.find(1)
// 返回多条记录
// demo05.js
Customer.find([1, 2, 3])

where()方法用于指定查询条件(完整代码看这里)。

// demo04.js
Customer.where({Company: ‘Apple Inc.‘}).first()

如果直接读取类,将返回所有记录。

// 返回所有记录
const customers = await Customer;

但是,通常不需要返回所有记录,而是使用limit(limit[, offset])方法指定返回记录的位置和数量(完整代码看这里)。

// demo06.js
const customers = await Customer.limit(5, 10);)

上面的代码制定从第10条记录开始,返回5条记录。

6.2 新建记录

create()方法用于新建记录(完整代码看这里)。

// demo12.js
Customer.create({
 Email: ‘‘,

FirstName

: ‘Donald‘,
 LastName: ‘Trump‘,
 Address: ‘Whitehouse, Washington‘
})

6.3 更新记录

update()方法用于更新记录(完整代码看这里)。

// demo13.js
const customer = await Customer.find(60);
await customer.update({
 Address: ‘Whitehouse‘
});

6.4 删除记录

destroy()方法用于删除记录(完整代码看这里)。

// demo14.js
const customer = await Customer.find(60);
await customer.destroy();

https://www.toutiao.com/a6660637718638232078/

相关推荐

inspuryhq / 0评论 2020-07-28
技术之博大精深 / 0评论 2020-06-01