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

初始化 sequelize

  1. // server.js
  2. const Hapi = require('hapi');
  3. const server = new Hapi.Server();
  4. //注册到 hapi server
  5. server.register(
  6. [
  7. {
  8. register: require('hapi-sequelize'),
  9. options: {
  10. database: '',
  11. user: '',
  12. pass: '',
  13. dialect: 'mysql',
  14. port: 3306,
  15. models: 'Models/**/*.js',
  16. sequelize: {
  17. define: {
  18. underscoredAll: true
  19. }
  20. }
  21. }
  22. },
  23. ], (err) => {
  24. if (err) {
  25. console.error('failed to load plugin');
  26. }
  27. }
  28. );

定义数据模型

  1. // Models/user.js
  2. function userModel(sequelize, DataTypes) {
  3. var User = sequelize.define('User', {
  4. user_name: { //定义User表中的每一个字段
  5. type: DataTypes.STRING, //字段数据类型
  6. allowNull: false //是否允许为空
  7. },
  8. user_level: {
  9. type: DataTypes.INTEGER,
  10. allowNull: false
  11. },
  12. user_proj: {
  13. type: DataTypes.STRING
  14. }
  15. });
  16. return User;
  17. }
  18. module.exports = userModel;

同步模型到数据库

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

使用模型

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

  1. // Route/index.js
  2. function index(req, res) {
  3. var models = req.server.plugins['hapi-sequelize'].db.sequelize.models;
  4. models.User.find({...}).then({...});
  5. }
  6. module.exports = {
  7. method: 'GET',
  8. path: '/',
  9. handler: index
  10. }];

新增一条记录

  1. models.User.create({
  2. user_name: 'John',
  3. user_level: 9
  4. }).then((data) => {
  5. //...
  6. });

查询记录

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

删除记录

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

多表查询

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

  1. //1:1
  2. // user model
  3. var user = sequelize.define('User', {/*attribute*/});
  4. User.hasOne(userInfo);
  5. // userInfo model
  6. var userInfo = sequelize.define('userInfo', {/*attribute*/});
  7. userInfo.belongsTo(User);
  8. // 查
  9. var userInfo = yield user.getUserInfo();

自定义SQL

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

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

参考资料

http://docs.sequelizejs.com/

Node.js ORM 框架 sequelize 实践的更多相关文章

  1. Node.js ORM框架Sequelize使用示例

    示例代码: const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username' ...

  2. Node.js ORM框架Sequlize之表间关系

    Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系.基于模型关系可以实现关联表之间的连接查询.更新.删除等操作.本文将通过一个示例,介绍模型的定义,创建模型关联关系 ...

  3. node.js & ORM & ODM

    node.js & ORM & ODM ODM & NoSQL Object Data Modeling 对象数据模型 Object Document Mapping 对象文档 ...

  4. Nodejs ORM框架Sequelize快速入门

    Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...

  5. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  6. 全端开发必备!10个最好的 Node.js MVC 框架

      Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API  以及大量的服 ...

  7. Koa – 更加强大的下一代 Node.js Web 框架

    Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一​​套优雅的方法,使服务器端开 ...

  8. 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)

    thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...

  9. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

随机推荐

  1. ZooKeeper设置ACL权限控制

    ZK的节点有5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 增.删.改.查.管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)注:这5种权限中,del ...

  2. Elasticsearch 字段数据类型

    Elasticsearch 可以支持单个document中含有多个不同的数据类型. 核心数据类型(Core datatypes) 字符型(String datatype):string 数字型(Num ...

  3. Postgresql死锁处理

    今天遇到Postgresql的一个问题,部分表记录的update一直无效报错,初步判断为锁表,赶紧进行解决. 1. 查询死锁进程列表 select * from pg_stat_activity wh ...

  4. MongoDB数据导入导出成csv或者json

    1. 从远程数据表拉取数据到本地json文件 mongoexport --host 远程服务器IP --port 远程服务器端口 --username 远程数据库用户名 --password 远程数据 ...

  5. oracle 字符转字符串函数

    select cast('addd' as varchar(4)) from dual;

  6. 通过XmlHttpRequest实现带进度条异步下载文件

    本博文源自技术群的讨论,因为网上找不到实现这样效果的的代码,而我说没问题,可以实现,因此有人质疑我是否能做到,呵呵,现将我实现代码贴出如下,希望有兴趣的同学可以继续完善: 本代码仅做技术展现,请勿探讨 ...

  7. The remote name could not be resolved问题的解决方法

    网站如果绑定了代理ip,内部跳转的时候,就会报The remote name could not be resolved错误,这个错误很难排查,网上也没有多少可参考的例子 现在记录下解决方法,以备参考 ...

  8. iOS开发中打电话发短信等功能的实现

    在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...

  9. Block回调

    •Block的定义   •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现    ...

  10. Dijkstra搜索算法

    Dijkstra无向图 算法执行步骤如下: 上面两张图来源于:http://blog.csdn.net/v_july_v/article/details/6096981 很牛的大神,膜拜,此处有鲜花 ...