Orm对象关系映射
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 有下面这些优点。
- 数据模型都在一个地方定义,更容易更新和维护,也利于重用代码。
- ORM 有现成的工具,很多功能都可以自动完成,比如数据消毒、预处理、事务等等。
- 它迫使你使用 MVC 架构,ORM 就是天然的 Model,最终使代码更清晰。
- 基于 ORM 的业务代码比较简单,代码量少,语义性好,容易理解。
- 你不必编写性能不佳的 SQL。
但是,ORM 也有很突出的缺点。
- ORM 库不是轻量级工具,需要花很多精力学习和设置。
- 对于复杂的查询,ORM 要么是无法表达,要么是性能不如原生的 SQL。
- 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();