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应用程序的快速开发.下面是一 ...
随机推荐
- ZooKeeper设置ACL权限控制
ZK的节点有5种操作权限:CREATE.READ.WRITE.DELETE.ADMIN 也就是 增.删.改.查.管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写)注:这5种权限中,del ...
- Elasticsearch 字段数据类型
Elasticsearch 可以支持单个document中含有多个不同的数据类型. 核心数据类型(Core datatypes) 字符型(String datatype):string 数字型(Num ...
- Postgresql死锁处理
今天遇到Postgresql的一个问题,部分表记录的update一直无效报错,初步判断为锁表,赶紧进行解决. 1. 查询死锁进程列表 select * from pg_stat_activity wh ...
- MongoDB数据导入导出成csv或者json
1. 从远程数据表拉取数据到本地json文件 mongoexport --host 远程服务器IP --port 远程服务器端口 --username 远程数据库用户名 --password 远程数据 ...
- oracle 字符转字符串函数
select cast('addd' as varchar(4)) from dual;
- 通过XmlHttpRequest实现带进度条异步下载文件
本博文源自技术群的讨论,因为网上找不到实现这样效果的的代码,而我说没问题,可以实现,因此有人质疑我是否能做到,呵呵,现将我实现代码贴出如下,希望有兴趣的同学可以继续完善: 本代码仅做技术展现,请勿探讨 ...
- The remote name could not be resolved问题的解决方法
网站如果绑定了代理ip,内部跳转的时候,就会报The remote name could not be resolved错误,这个错误很难排查,网上也没有多少可参考的例子 现在记录下解决方法,以备参考 ...
- iOS开发中打电话发短信等功能的实现
在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...
- Block回调
•Block的定义 •Block.委托.通知.回调函数,它们虽然名字不一样,但是原理都一样,都是"回调机制"的思想的具体实现 •前面的代理模式的项目改为Block回调实现 ...
- Dijkstra搜索算法
Dijkstra无向图 算法执行步骤如下: 上面两张图来源于:http://blog.csdn.net/v_july_v/article/details/6096981 很牛的大神,膜拜,此处有鲜花 ...