
waterline 是一個(gè)讓js支持ORM的框架
1.什么是ORM?
ORM簡(jiǎn)介
對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱(chēng)ORM)模式是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。簡(jiǎn)單的說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。那么,到底如何實(shí)現(xiàn)持久化呢?一種簡(jiǎn)單的方案是采用硬編碼方式,為每一種可能的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)操作提供單獨(dú)的方法。
像java,ruby,python,甚至golang 和 swift開(kāi)發(fā)語(yǔ)言都有相關(guān)的ORM框架.waterline是作為node其中一種ORM框架。類(lèi)似的ORM框架還有sequelize,bookshelf
2.為什么要選擇waterline.js
上面提到過(guò)waterlin只是nodeORM框架其中之一,理由如下:
1.waterline 是 node mvc框架sails 團(tuán)隊(duì)開(kāi)發(fā)的旗下框架。
2.waterline 具有廣泛的數(shù)據(jù)庫(kù)支持支持幾乎所有的主流關(guān)系數(shù)據(jù)庫(kù)和文檔數(shù)據(jù)庫(kù)包括redis
3.多樣的操作支持:提供了 26 種方法來(lái)進(jìn)行增刪改查操作
4.豐富的數(shù)據(jù)類(lèi)型:支持 JavaScipt 中除了對(duì)象外的所有數(shù)據(jù)類(lèi)型,還額外提供了日期、時(shí)間、二進(jìn)制、JSON的支持,數(shù)字還可以區(qū)分整數(shù)和浮點(diǎn)數(shù)
為了方便理解Waterline可以分為3個(gè)部分組成 分別是3個(gè)對(duì)象(下面代碼是連貫的)
1.適配器
2.連接
3.模型
適配器
var mysqlAdapter = require('sails-mysql')
var mongAdapter = require('sails-mong')
var Waterline = require('waterline')
//適配器
var adapters = {
mysql:mysqlAdapter,
mongo:mongAdapter
default:'mysql'
};
// 連接
var connections = {
mysql:{
adapter:'mysql',
url:'mysql://root:123@localhost:3306/mubin'
},
mongo:{
adapter:'mongo',
url:'mongodb://root:123@localhost:3306/mubi
}
}
模型
//models/post
var Waterline = require('waterline')
module.exports = Waterline.Collection.extend(
{
identity:'post',
connection:'mysql',
attributes: {
// e.g., "Polly"
title:{type:'string'},
content:{type:'string'}
}
})
//模型
var User = Waterline.Collection.extend({
identity:'user', //數(shù)據(jù)集合的名字 在mysql叫表
connection:'mysql', //設(shè)定那個(gè)連接
schema:true, //是否強(qiáng)制模式
attributes:{ //字段設(shè)置
username:{ //字段名
type:'string', //數(shù)據(jù)類(lèi)型
required:true //校驗(yàn)器--是否必須
},
birthday:{
type:'data',
before:function(){ //這也是校驗(yàn)器 跟多的校驗(yàn)器下面地址給出
return new Data()
}
},
createTime:{
type:'data'
}
},
beforeCreate:function(value,cb){ //生命周期回調(diào) 在下方給出
value.createTime = new Date();
console.log('beforeCreate executed');
return cb()
}
});
生命周期回調(diào):
- 創(chuàng)建時(shí):beforeValidate/afterValidate/beforeCreate/afterCreate
- 更新:beforeValidate/afterValidate/beforeUpdate/afterUpdate
- 刪除時(shí):beforeDestroy/afterDestroy
有了上面的適配器,連接,模型3個(gè)組成我們就可以進(jìn)行初始化了
var orm = new Waterline();
orm.loadCollection(User);
var config = {
apaters:adaters,
connections:connections
}
orm.initizlize(config,function(err,models{
if (err){
console.error('orm initizlize failed',err)
return;
}
console.log('success!')
}))
在express 集成 waterline (MVC模式)
1.創(chuàng)建一個(gè)wateline.js 便于管理 export
//waterline.js
var Waterline = require('waterline')
var sqlAdapter = require('sails-mysql')
var User = require('../models/User')
var wlconfig = {
adapters:{
mysql:sqlAdapter,
default:'mysql'
},
connections:{
mysql:{
adapter:'mysql',
url:'mysql:'mysql://root:123@localhost:3306/kuhappo'
}
}
}
var orm = new Waterline();
orm.loadCollection(User);
exports.wlconfig = wlconfig; \\導(dǎo)出一個(gè) 配置文件
exports.orm = orm; \\導(dǎo)出一個(gè)實(shí)例
models
var Waterline = require('waterline')
module.exports = Waterline.Collection.extend(
{
identity:'post',
connection:'mysql',
attributes: {
// e.g., "Polly"
title:{type:'string'},
content:{type:'string'}
}
})
我們需要在bin/www 入口文件 進(jìn)行waterline 初始化
var waterline = require('../config/waterline')
// bin/www
waterline.orm.initialize(waterline.wlconfig,function(err,models){
if (err){
console.log('waterline initialize fail',err)
}
app.set('models',models.collections) //初始化成功會(huì)返回映射完的對(duì) 象
})
在 app.js添加 中間件處理 讓 req 擁有models (映射的對(duì)象)因?yàn)檫@是中間件所以我要把這句寫(xiě)前面
//app.js
app.use(function(req,res,next){
req.models = app.get('models');
next();
});
app.use('/', index);
router.js
var express = require('express');
var router = express.Router();
// var userContoller = require('../controllers/userController')
var postController = require('./../controllers/postController')
router.get('/',postController.create)
module.exports = router;
postController.js
module.exports = {
create:function(req,res,next){
req.models.post.create({title:"req.query.title",content:"req.query.content"},function(err,models){
if (err) return next(err);
return res.json()
});
}
}