概述
写这篇blog的原因,想找个node的ORM框架用用,确很难找到一篇对比分析这些ORM框架的文章,唯一找到了一篇,居然是通过star数来论英雄,我觉着很难服众,于是就找几个看看。后来又不想分析,因为我发现node这种野蛮生长,滋生这些ORM轮子比比皆是,远比我想象的多;后来又觉着可以写,作为一个java出身业余研究node的就想通过java的ORM框架来洞悉node这群ORM框架的是非曲直,于是挑了几个框架小扯一篇。
ORM框架
ORM框架:Object Relational Mapping,对象-关系-映射,所以说ORM框架就是用面向对象的方式和目前的关系型数据库做匹配,java开发者目前主流的hibernate、mybatis很熟悉了,JDBC原始驱动的方式想必也不在成为主流了。下面介绍几款node的ORM框架,介绍之前先介绍ORM的两种模式:
Active Record 模式:活动记录模式,领域模型模式一个模型类对应关系型数据库中的一个表,模型类的一个实例对应表中的一行记录。这个不难理解,比较简单,但是不够灵活,再看另一种模式,比较一下
Data Mapper 模式:数据映射模式,领域模型对象和数据表是松耦合关系,只进行业务逻辑的处理,和数据层解耦。需要一个实体管理器来将模型和持久化层做对应,这样一来,灵活性就高,当然复杂性也增加了。
所以说,Data Mapper模式对业务代码干预少,Active Record模式直接在对象上CRUD,代码编写也更方便,这就像hibernate和mybatis两种框架,如果想深入研究,可以了解一下贫血与充血领域对象的平衡。
有这么一句话很认同,ActiveRecord更加适合快速开发成型的短期简单项目,而DataMapper更加适合长线开发,保持业务逻辑与数据存储独立的复杂项目。除此之外,技术选型还要考虑其他因素,比如项目历史背景等等。
TypeORM
TypeORM 是一个 ORM 框架,详细介绍见 TypeORM 官方介绍,TypeORM 也借鉴了hibernate,所以你会发现它特别熟悉,尤其是装饰类的方式。
闲话少说,直接用CLI 命令快速构建项目
1 | npm install typeorm -g |
创建项目
1 | typeorm init --name MyProject --database mysql |
name
是项目的名称,database
是将使用的数据库,TypeORM 支持多种数据库。
生成文档结构
1 | MyProject |
修改 ormconfig.json
数据库配置文件,直接运行就可以了
1 | npm start |
看一下实体model,user类
1 | import {Entity, PrimaryGeneratedColumn, Column} from "typeorm"; |
CRUD操作:逻辑层
1 | import "reflect-metadata"; |
所以,TypeORM的方式很像hibernate的方式,虽然es6中就已经有装饰器类似java的注解的功能了,但是还是和装饰器有所区别,因为TypeORM采用的是TypeScript 的方式,TypeScript 是 JavaScript 的一个超集,TypeScript 采用类型注解方式,虽然支持es6的标准,但是有些语法还是需要了解,这也或多或少增加了一些选择难度。
Sequelize
这个被star数最多了一个ORM框架,官方居然不给中文文档,找个CLI命令快速构建也没有,也没找到个合适轮子,只能自己搭了,也不是少了轮子就不能活了。不过Sequelize的官网文档看着很顺眼,不得不称赞一下,需要注意的一点Sequelize v5版本发生了比较大的变化,这里我以最新版本v5版本为主,老版本可以自己看看下官方文档。Sequelize v5
安装npm包
1 | $ npm install --save sequelize |
数据库的配置文件config.js
1 | module.exports = { |
构建数据库访问公共文件db.js
1 | const Sequelize = require('sequelize') |
model
1 | const {Sequelize, Model} = require('sequelize') |
还有一种写法,兼容老版本,不推荐
1 | const User = db.define('user', { |
这种实际上是sequelize.define内部调用了model.init,但是老版本是没有第一种写法的。
此外需要知道的是,sequelize还默认为每个模型定义字段id(主键)、createdat和updatedat,也可以进行设置。
我们的db.js文件里面配置了,不自动创建模型,也就是自动创建数据表,关闭是有原因的,因为如果表存在会先drop然后再创建,这种操作本身就很可怕的
1 | // 创建模型 |
单个模型也可以配置,切记这种操作很危险,尤其是生成环境
1 | // Note: using `force: true` will drop the table if it already exists |
CRUD操作:然后看一下逻辑层,就非常简单了,直接使用ES7 async/await
即可
1 | // Find all users |
由此来看,没有typeorm装饰类的方式看着顺眼,但是整体构造也容易上手,操作简单,容易理解,看官网文档,功能覆盖强大,typeorm用户反馈使用问题比Sequelize要多,后期用到再做比较。
ORM2
ORM2貌似没有正了八经的官网,所以看起来就特别麻烦,但是可以看一下github介绍node-orm2,只支持四种数据库MySQL、PostgreSQL、Amazon Redshift、SQLite,这个我没写demo,直接分析一下
安装
1 | npm install orm |
数据库连接
1 | var orm = require("orm"); |
model
1 | var Person = db.define('person', { |
CRUD操作
1 | Person.create([ |
1 | Person.get(1, function (err, John) { |
1 | Person.find({ |
所以,准确应该是node-orm2,写法和sequelize类似,但是文档确实不行,数据库支持也少,很难想象后续的可维护性。
其它
bookshelf(这个用的也挺多)
persistencejs
waterline
mongoose
node-mysql
knex
。。。