初步使用sequelize模块 - Node实战

在Node Web开发过程中,后台数据库我一直使用的都是Mysql,没有别的什么原因,就觉得熟悉,图形界面操作起来比较简单,简化了好多关于数据库方面的操作。

最开始的时候,我一直都是提前将我要的数据表在Mysql里用图形界面创建好,然后再开始我的项目代码编写,当然这个过程一直穿插在整个项目的开发中,有时候某个功能最开始想得不太全,于是就重新修改数据表,再根据数据表结构进行代码的修改。刚开始学习的时候,一直关注前台后台逻辑,数据库方面关注得比较少,而且开发基本都是自己一个人一台机器上完成,所以也没觉得这种操作特别麻烦。

后来换台机器继续写代码的时候,就会发现,这种方式真的是太不方便了,当我在A电脑上修改了代码,并且修改了数据表结构之后,去B电脑上通过GIt同步代码,但是数据表结构还得copy一份A电脑上修改过的数据表结构,想想也是醉了。这种实现方式不仅比较Low,并且维护起来也非常的不方便,一方面要写交互逻辑代码,一方面要拼接sql语句来获取数据。

从理论上讲应该在后台业务逻辑以及数据库取数逻辑中间再架一层,将数据库操作全部封装起来,调用对象方法而取消拼接SQL来实现数据的获取,没错,这就是ORM(Object Relational Mapping)框架。

于是乎我找到了Sequelize,看看文档,用起来感觉还是不错,最起码解决了我的上述的困扰。

引入模块等等准备工作我就不多废话了,直接上手实战。

1. 创建连接对象,并模块化

新建数据库连接模块dbConnect.js,单独提出连接数据库的对象sequelize,如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var Sequelize = require('sequelize');
// 引入数据库配置文件
var sqlConfig = require('config-lite')(__dirname).mysql;
var sequelize = new Sequelize(sqlConfig.database, sqlConfig.user, sqlConfig.password, {
host: sqlConfig.host,
dialect: 'mysql',
pool: {
max: 10,
min: 0,
idle: 10000
}
});
module.exports = sequelize;

上面代码使用了配置模块config-lite,具体使用可以参考这篇文章。然后根据数据库的一些参数,创建了sequelize的数据库连接模块。

2. 定义数据表结构,将表结构写进代码里

目前我使用的方式是:每个表对应一个文档,放入Node项目中models目录中,这里拿我创建的一个todolist表来做示例,在models目录中创建todolist.js文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var Sequelize = require('sequelize');
var sequelize = require('./dbConnect.js');
var todolist = sequelize.define('todolist',{
id: {
type: Sequelize.BIGINT(11),
primaryKey: true,
allowNull: false,
unique: true,
autoIncrement: true
},
title: Sequelize.STRING(100), // 标题
content: Sequelize.STRING(500), // 详细内容
priority: Sequelize.INTEGER, // 级别
owner: Sequelize.STRING, // 承接人
officer: Sequelize.STRING, // 负责人
startDate: Sequelize.STRING, // 开始时间
planFinishDate: Sequelize.STRING, // 计划完成时间
realFinishDate: Sequelize.STRING, // 实际完成时间
bz: Sequelize.STRING(500), // 备注
state: Sequelize.INTEGER, // 状态
createdAt: Sequelize.BIGINT,
updatedAt: Sequelize.BIGINT,
version: Sequelize.BIGINT
},{
timestamps: false // 不要默认时间戳
});
module.exports = todolist;

以上代码,直接引入之前创建的sequelize对象,然后使用defind方法定义数据表结构。其他的所有数据表都可以通过这种方式来定义,保存在每一个独立的文件中,引出数据模块即可。

3. 同步数据表结构

这个就简单了,单独创建一个工具类,我的做法是在项目中新建libs/util目录,然后新建syncTable.js,代码如下:

1
2
3
4
5
6
var todolist = require('../../models/todolist.js');
// 同步表结构
todolist.sync({
force: true // 强制同步,先删除表,然后新建
});

这样就OK了,当每次我换电脑继续项目的时候,不用单独操作数据库以确保数据库结构一致了,只需要手动执行一下该方法就可以了。

4. 创建一些初始数据

通过这种方法,我们同样可以创建一个工具类,用来初始化一些基础数据,如下addMasterData.js代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var priority = require('../../models/priority.js');
// 创建u_priority表的基础数据
priority.create({
title: '重要 紧急'
}).then(function (p) {
console.log('created. ' + JSON.stringify(p));
}).catch(function (err) {
console.log('failed: ' + err);
});
priority.create({
title: '重要 不紧急'
}).then(function (p) {
console.log('created. ' + JSON.stringify(p));
}).catch(function (err) {
console.log('failed: ' + err);
});
priority.create({
title: '不重要 紧急'
}).then(function (p) {
console.log('created. ' + JSON.stringify(p));
}).catch(function (err) {
console.log('failed: ' + err);
});
priority.create({
title: '不重要 不紧急'
}).then(function (p) {
console.log('created. ' + JSON.stringify(p));
}).catch(function (err) {
console.log('failed: ' + err);
});

prioritys表里创建一些初始数据,默认表名会添加s,定义表的时候可以通过tableName属性值来定义对应的表名,如下示例将表名定义为u_priority

1
2
3
4
5
6
7
8
9
10
11
12
var priority = sequelize.define('priority',{
id: {
type: Sequelize.BIGINT(11),
primaryKey: true,
allowNull: false,
autoIncrement: true
},
title: Sequelize.STRING,
},{
timestamps: false,
tableName: 'u_priority' // 数据表名为u_priority
});

好了,本次就到这里,深入学习后再做分享。


更多内容请访问:http://lupeng.me