美文网首页
Node中Sequelize操作MySQL解决方案

Node中Sequelize操作MySQL解决方案

作者: 一点红3340 | 来源:发表于2017-07-21 18:02 被阅读0次

好久没写一篇博客了,这段时间都在忙换工作的事,终于再次稳定下来,后面全力向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中无比烦恼的回调了

相关文章

网友评论

      本文标题:Node中Sequelize操作MySQL解决方案

      本文链接:https://www.haomeiwen.com/subject/ayiekxtx.html