• Node.js ORM 框架 sequelize 实践


    最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.jshapi-sequelize插件对sequelize做了很简单的封装,可以让我们很自如地在hapi中游走,比如配置和调用。

    初始化 sequelize

    // server.js
    const Hapi = require('hapi');
    const server = new Hapi.Server();
    
    //注册到 hapi server
    server.register(
        [
            {
                register: require('hapi-sequelize'),
                options: {
                    database: '',
                    user: '',
                    pass: '',
                    dialect: 'mysql',
                    port: 3306,
                    models: 'Models/**/*.js',
                    sequelize: {
                        define: {
                            underscoredAll: true
                        }
                    }
                }
            },
        ], (err) => {
            if (err) {
                console.error('failed to load plugin');
            }
        }
    );
    

    定义数据模型

    // Models/user.js
    function userModel(sequelize, DataTypes) {
        var User = sequelize.define('User', {
            user_name: { //定义User表中的每一个字段
                type: DataTypes.STRING, //字段数据类型
                allowNull: false //是否允许为空
            },
            user_level: {
                type: DataTypes.INTEGER,
                allowNull: false
            },
            user_proj: {
                type: DataTypes.STRING
            }
        });
    
        return User;
    }
    
    module.exports = userModel;
    

    同步模型到数据库

    // server.js
    server.plugins['hapi-sequelize']
            .db.sequelize.sync().then(function () {
                console.log('models synced');
            });
    //sync方法如果配置{force: true}时,如果数据库是否有该表,如果有则会删除表,再重建。
    

    使用模型

    经过配置后,我们可以在路由handler中使用这个实例:

    // Route/index.js
    function index(req, res) {
        var models = req.server.plugins['hapi-sequelize'].db.sequelize.models;
        
        models.User.find({...}).then({...});
    }
    
    module.exports = {
        method: 'GET',
        path: '/',
        handler: index
    }];
    

    新增一条记录

    models.User.create({
        user_name: 'John',
        user_level: 9
    }).then((data) => {
        //...
    });
    

    查询记录

    var user = models.User.findOne({
        //...
    }).then((data) => {
        //...
    });
    这是一个异步过程,sequelize 内部使用了 bluebird 对异步流程控制。变量user得到的是 Promise 对象,并非查询结果。
    

    删除记录

    models.User.destroy({
       where: {
          id: 1
       }
    }).then(function(rowDeleted) {
      if(rowDeleted === 0){
         console.log('成功删除记录');
       }
    }, function(err){
        console.log(err); 
    });
    
    //软删除操作:
    // models.User.destroy({where: {id: userId}}, {force: false});
    // 恢复软删除,使用 restore 方法 http://sequelize.readthedocs.org/en/latest/api/instance 
    

    多表查询

    要实现用户权限管理的RBAC模型,那需使用到多表查询,其实就是数据库中的association:

    //1:1
    // user model
    var user = sequelize.define('User', {/*attribute*/});
    User.hasOne(userInfo);
    
    // userInfo model
    var userInfo = sequelize.define('userInfo', {/*attribute*/});
    userInfo.belongsTo(User);
    
    // 查
    var userInfo = yield user.getUserInfo();
    

    自定义SQL

    当业务较复杂时,sequelize 有可能无法满足你的需求,你可以编写自己的SQL语句:

    var sequelize = req.server.plugins['hapi-sequelize'].db.sequelize;
    
    sequelize.query('SELECT * ...');
    

    参考资料

    http://docs.sequelizejs.com/

  • 相关阅读:
    封装小程序http请求
    ES6为数组做的扩展
    练习题
    二叉树的遍历
    快速搭建vue项目
    收集的前端面试大全
    ios兼容webp格式的图片
    小程序开发API之获取启动参数
    使用HTML编写邮件
    深入理解javascript原型和闭包(9)——this
  • 原文地址:https://www.cnblogs.com/zzbo/p/5906089.html
Copyright © 2020-2023  润新知