Node.js ORM 框架 sequelize 实践
最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.js,hapi-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 * ...');
参考资料
Node.js ORM 框架 sequelize 实践的更多相关文章
- Node.js ORM框架Sequelize使用示例
示例代码: const Sequelize = require('sequelize'); const sequelize = new Sequelize('database', 'username' ...
- Node.js ORM框架Sequlize之表间关系
Sequelize模型之间存在关联关系,这些关系代表了数据库中对应表之间的主/外键关系.基于模型关系可以实现关联表之间的连接查询.更新.删除等操作.本文将通过一个示例,介绍模型的定义,创建模型关联关系 ...
- node.js & ORM & ODM
node.js & ORM & ODM ODM & NoSQL Object Data Modeling 对象数据模型 Object Document Mapping 对象文档 ...
- Nodejs ORM框架Sequelize快速入门
Nodejs ORM框架Sequelize快速入门 什么是ORM? 简单的讲就是对SQL查询语句的封装,让我们可以用OOP的方式操作数据库,优雅的生成安全.可维护的SQL代码.直观上,是一种Model ...
- Node.js Express 框架
Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...
- 全端开发必备!10个最好的 Node.js MVC 框架
Node.js 是最流行的 JavaScript 服务端平台,它允许建立可扩展的 Web 应用程序.Node.js 包含不同类型的框架,如 MVC 框架.全栈框架.REST API 以及大量的服 ...
- Koa – 更加强大的下一代 Node.js Web 框架
Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一套优雅的方法,使服务器端开 ...
- 【360开源】thinkjs:基于Promise的Node.js MVC框架 (转)
thinkjs是360奇舞团开源的一款Node.js MVC框架,该框架底层基于Promise来实现,很好的解决了Node.js里异步回调的问题.360奇舞团(奇虎75Team),是奇虎360公司We ...
- Node.js Express框架
Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...
随机推荐
- DIOCP单元文件应用场景
diocp.coder.tcpServer是用来做文件传输的 diocp.tcp.server这个是用来做通讯的
- 获取图片工具类:BitmapUtil
package com.example.administrator.filemanager.utils;import android.content.Context;import android.gr ...
- nginx配置文件httpd.conf详解
PS:Nginx使用有两三年了,现在经常碰到有新用户问一些很基本的问题,我也没时间一一回答,今天下午花了点时间,结合自己的使用经验,把Nginx的主要配置参数说明分享一下,也参考了一些网络的内容,这 ...
- C# 委托和事件 与 观察者模式(发布-订阅模式)讲解 by天命
使用面向对象的思想 用c#控制台代码模拟猫抓老鼠 我们先来分析一下猫抓老鼠的过程 1.猫叫了 2.所有老鼠听到叫声,知道是哪只猫来了 3.老鼠们逃跑,边逃边喊:"xx猫来了,快跑啊!我是老鼠 ...
- Masonry控制台打印约束冲突问题解决
不知道你是不是视图的布局也是用的第三方Masonry,在使用中是不是也遇到了控制台约束冲突的警告打印,看下图: 从输出的信息可以知道,有的控件的约束明显重复了设置,所以指出了是哪个控件,重复设置了哪些 ...
- flash中设置文本字体样式
txt.setTextFormat(tf); txt.defaultTextFormat = tf;
- SpringMVC集成缓存框架Ehcache
在互联网应用中,应用并发比传统企业及应用会高出很多.解决并发的根本在于系统的响应时间与单位时间的吞吐量.思路可分为:一减少系统的不必要开支(如缓存),二是提高系统单位时间内的运算效率(如集群). 在硬 ...
- Nginx-->基础-->理论-->002:Nginx进程介绍
一.Nginx进程介绍
- spring 多线程 注入 服务层 问题
在用多线程的时候,里面要用到Spring注入服务层,或者是逻辑层的时候,一般是注入不进去的.具体原因应该是线程启动时没有用到Spring实例不池.所以注入的变量值都为null. 详细:http://h ...
- httpServletRequest对象、filter、servlet、servlet容器、catalina、tomcat、以及web容器之间的关系
学习servlet的时候经常感到疑惑 HttpServletRequest是服务器创建的?还是servlet容器创建的? 过滤器是服务器创建的?还是servlet容器创建的? serlet容器和tom ...