waterline 是一个让js支持ORM的框架
1.什么是ORM?
ORM简介
对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
像java,ruby,python,甚至golang 和 swift开发语言都有相关的ORM框架.waterline是作为node其中一种ORM框架。类似的ORM框架还有sequelize,bookshelf
2.为什么要选择waterline.js
上面提到过waterlin只是nodeORM框架其中之一,理由如下:
1.waterline 是 node mvc框架sails 团队开发的旗下框架。
2.waterline 具有广泛的数据库支持支持几乎所有的主流关系数据库和文档数据库包括redis
3.多样的操作支持:提供了 26 种方法来进行增删改查操作
4.丰富的数据类型:支持 JavaScipt 中除了对象外的所有数据类型,还额外提供了日期、时间、二进制、JSON的支持,数字还可以区分整数和浮点数
为了方便理解Waterline可以分为3个部分组成 分别是3个对象(下面代码是连贯的)
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', //数据集合的名字 在mysql叫表
connection:'mysql', //设定那个连接
schema:true, //是否强制模式
attributes:{ //字段设置
username:{ //字段名
type:'string', //数据类型
required:true //校验器--是否必须
},
birthday:{
type:'data',
before:function(){ //这也是校验器 跟多的校验器下面地址给出
return new Data()
}
},
createTime:{
type:'data'
}
},
beforeCreate:function(value,cb){ //生命周期回调 在下方给出
value.createTime = new Date();
console.log('beforeCreate executed');
return cb()
}
});
生命周期回调:
- 创建时:beforeValidate/afterValidate/beforeCreate/afterCreate
- 更新:beforeValidate/afterValidate/beforeUpdate/afterUpdate
- 删除时:beforeDestroy/afterDestroy
有了上面的适配器,连接,模型3个组成我们就可以进行初始化了
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.创建一个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; \\导出一个 配置文件
exports.orm = orm; \\导出一个实例
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 入口文件 进行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) //初始化成功会返回映射完的对 象
})
在 app.js添加 中间件处理 让 req 拥有models (映射的对象)因为这是中间件所以我要把这句写前面
//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()
});
}
}