Waterline.js

Paste_Image.png

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()
    }
});

校驗(yàn)器https://github.com/sailsjs/anchor

生命周期回調(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()
        });
    }
}

以上就是我的waterline 筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,324評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,660評(píng)論 4 61
  • 泉眼無(wú)聲惜細(xì)流,樹(shù)陰照水愛(ài)晴柔。 小荷才露尖尖角,早有蜻蜓立上頭。
    若水無(wú)心一閱讀 508評(píng)論 2 5
  • 在App的開(kāi)發(fā)中,測(cè)試也是必不可少的一個(gè)環(huán)節(jié),相比于用手點(diǎn)屏幕去測(cè)試,測(cè)試元素少的界面還能點(diǎn)個(gè)幾次試試,但是遇到界...
    魏天晨閱讀 522評(píng)論 0 0
  • 某小城中心的商業(yè)街又響起了長(zhǎng)長(zhǎng)的鞭炮聲,又一家新店開(kāi)業(yè)了,這幾年生意越來(lái)越不好做,商業(yè)街這幾個(gè)門(mén)店走馬燈一樣,隔幾...
    天蝎座的女人閱讀 510評(píng)論 0 1

友情鏈接更多精彩內(nèi)容