好久没写一篇博客了,这段时间都在忙换工作的事,终于再次稳定下来,后面全力向Node前进了。
Sequelize是一个基于promise的关系型数据库ORM框架(Object-Relational-Mapper),通过建立数据库地图模型,就可以很方便的通过查询参数操作数据库,而操作数据库之后的回调全部默认通过promise的方式实现,当然现在还可通过ES7的await/async配合promise来实现代码逻辑,看起来将会更舒服。
安装
npm install sequelize
npm install mysql
建立model
当我们在开发一个大型项目的时候,往往不止需要调动一个映射表,为了避免每次调动都需要自己加上配置参数、同时可以在团队协作中统一配置,我们应该为每一个映射表单独建立一个model文件。
比如连接一个叫db_live的数据库,我们可以先建立一个所有映射表通用的db_live_config.js文件,在里面加上数据库基本配置如下:
const Sequelize = require('sequelize');
console.log('init dbbase...');
//连接数据库
var db_live = new Sequelize('dbname', 'username', 'password', {
host: 'localhost',
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 10000
}
});
const ID_TYPE = Sequelize.STRING(50);
//统一映射模型的基本配置
function defineModel(name, attributes) {
//name为表名
//attributes为传入的业务字段数组
var attrs = {};
for (let key in attributes) {
let value = attributes[key];
//判定是否允许本属性的字段为空值
if (typeof value === 'object' && value['type']) {
value.allowNull = value.allowNull || false;
attrs[key] = value;
} else {
attrs[key] = {
type: value,
allowNull: false
};
}
}
//下面是通用配置的类型定义,由个人需求看是否添加
attrs.id = {
type: ID_TYPE,
primaryKey: true
};
attrs.createdAt = {
type: Sequelize.BIGINT,
allowNull: false
};
attrs.updatedAt = {
type: Sequelize.BIGINT,
allowNull: false
};
attrs.version = {
type: Sequelize.BIGINT,
allowNull: false
};
//模型映射定义
//attrs现在是业务字段加上通用配置字段的总数组了
return db_live.define(name, attrs, {
tableName: name,
timestamps: false,
' freezeTableName': true,//否则会自动为表名添加一个后缀s
//判断是否是isNewRecord从而设置主键、时间戳和版本号
hooks: {
beforeValidate: function (obj) {
let now = Date.now();
if (obj.isNewRecord) {
if (!obj.id) {
obj.id = generateId();
}
obj.createdAt = now;
obj.updatedAt = now;
obj.version = 0;
} else {
obj.updatedAt = Date.now();
obj.version++;
}
}
}
});
}
定义表的业务字段
接下来我们可以为需要操作的某一个表(t_live)添加一个t_live.js,如下:
const db_live = require('../db_live_config');
module.exports = db_live.defineModel('t_live', {
email: {
type: db.STRING(100),
unique: true
},
passwd: db.STRING(100),
name: db.STRING(100),
gender: db.BOOLEAN
});
调用
const t_live = require('./t_live');
t_live.create({
//新增字段
}).then(result => {
//回调
}).catch(err => {
//错误处理
})
关于这里使用await/async配合promise可以让代码看起来更清新
(async () => {
var result = await t_live.create({
//新增字段
});
//回调代码
})();
PS:
目前最新版本的Node已经正式支持await/async,可以更愉快的对待Node中无比烦恼的回调了
网友评论