waterline和Sails.js同一團(tuán)隊(duì)開發(fā),支持幾乎所有的主流數(shù)據(jù)庫,是nodejs下一款非常強(qiáng)大的orm,可以顯著提升開發(fā)效率

 

一.waterline支持的數(shù)據(jù)庫

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

 

二.waterline的配置

Waterline 之所以可以使用一樣的代碼來操作多種數(shù)據(jù)庫,奧妙在于其適配器。在進(jìn)行配置的時候,需要設(shè)置兩方面的內(nèi)容,一是具體使用哪些適配器,二是建立數(shù)據(jù)庫連接的時候,使用哪個適配器。下面是使用 MongoDB/Mysql 的適配器創(chuàng)建一個數(shù)據(jù)庫連接的配置

MongoDB:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 var mongoAdapter = require('sails-mongo'); 2 var wlconfig = { 3   adapters: { 4     'default': mongoAdapter, 5     'mongo': mongoAdapter 6   }, 7   connections: { 8     'mongo': { 9       // adapters 中的適配器代碼10       adapter: 'mongo',11       url: 'mongodb://localhost/waterline-sample'12     }13   }14 };

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

sails-mongo 為mongo的適配器,執(zhí)行命令安裝:
npm i sails-mongo --save

Mysql:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 var mysqlAdapter = require('sails-mysql'); 2 var Waterline = require('waterline'); 3  4 var icbcgold = require('../models/IcbcGold') 5  6 //適配器與連接設(shè)置 7 var wlconfig = { 8     adapters: { 9         mysql: mysqlAdapter, //mysql適配器10         default: 'mysql' //默認(rèn)的適配器11     },12     connections: {13         //mysql連接14         mysql: {15             adapter: 'mysql',//指定適配器為mysql16             url: 'mysql://root:@localhost/IcbcGold' //連接字符串17         }18     }19 }

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

sails-mysql 為mysql適配器,執(zhí)行命令安裝:
1 npm i sails-mysql --save

 連接字符串說明:數(shù)據(jù)庫類型://用戶名:密碼@數(shù)據(jù)庫地址/數(shù)據(jù)庫名

三.waterline的Model的定義

執(zhí)行命令安裝waterline:

 

npm i waterline --save

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 var Waterline = require('waterline'); 2  3 module.exports = Waterline.Collection.extend({ 4     identity: 'icbcgold',  //模型名,如果沒有設(shè)置 tableName 屬性,那么waterline默認(rèn)將模型名設(shè)置為表名 5     tableName: 'tb_IcbcGold',//指定表名 6     connection: 'mysql',//指定數(shù)據(jù)庫連接 7     // 是否強(qiáng)制模式 8     schema: false, 9     attributes: {10         Id: {11             type: 'string',12             primaryKey: true13         },14         DataTime: {15             type: 'datetime'16         },17         DataNumber: {18             type: 'float'19         }20     }21 });

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

配置相當(dāng)簡單方便,類似于 Mongoose 中的 Schema。但要注意,指定屬性的字段時,使用的是一個字符串值,而不是 JavaScript 中的具體類型,目前支持的數(shù)據(jù)類型有 string / text / integer / float / date /time / datetime / boolean / binary / array / json,這個范圍要比 JavaScript 的類型范圍大。

除了這四個基本配置,還可以配置校驗(yàn)器,添加自定義的方法,設(shè)置生命周期回調(diào)方法等。

 

注意:

  1.如果沒有定義主鍵,那么waterline會為你默認(rèn)創(chuàng)建名為id的主鍵,類型是整型自增長

  2.waterline自動創(chuàng)建表時會為你添加 createdAt、updatedAt兩個字段,類型為datetime,分別在insert和update操作更新字段代表的是記錄的創(chuàng)建時間和更新時間

  3.如果不想自動創(chuàng)建列createdAt、updatedAt,那么請?jiān)O(shè)置autoCreatedAt,autoUpdatedAt的值為false,如下圖

  平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

  4.waterline會自動根據(jù)定義的model創(chuàng)建表,但是如果你已經(jīng)創(chuàng)建好了表,但是與model定義有所區(qū)別,比如字段名不一樣,那么一定要注意了,請按照下圖設(shè)置,否則waterline將會刪除已經(jīng)存在表且根據(jù)model重新創(chuàng)建,以前的數(shù)據(jù)就完蛋了

  平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

 

 

四.校驗(yàn)器

校驗(yàn)器是在創(chuàng)建數(shù)據(jù)集合的時候指定給具體的屬性的

更多設(shè)置請查看:https://www.npmjs.com/package/waterline

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 attributes: { 2         title: { 3             type: 'string', 4             required: true,//必須的字段 5             maxLength: 100,//最大長度100 6             minLength: 5 //最小長度5 7         }, 8         views: { 9             type: 'integer',10             min: 011         },12         createTime: {13             type: 'date',14             // 在某個時間點(diǎn)之前15             before: '2017-12-31', 
16             // 在某個時間點(diǎn)之后17             after: function () {18                 return new Date();19             }20         }21     }

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

五.生命周期回調(diào)

 可以通過waterline,來實(shí)現(xiàn)在進(jìn)行特定操作的時候,調(diào)用自定義的方法。,在 create / update / destory時,均有多種回調(diào)。直接提供對應(yīng)的方法名,分別是:

  • 創(chuàng)建時:beforeValidate / afterValidate / beforeCreate / afterCreate

  • 更新時:beforeValidate / afterValidate / beforeUpdate / afterUpdate

  • 刪除時:beforeDestroy / afterDestroy

這些方法,需要在初始化數(shù)據(jù)集合的時候進(jìn)行定義。

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 //values值 cb回調(diào)方法 2 beforeCreate: function(values, cb) { 3   4     // 加密password字段的值 5     encrypt(values.password, function(err, password) { 6       if(err) return cb(err); 7   8       values.password = password; 9       cb();10     });11   },

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

六.查詢方法

waterline有以下查詢方法

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

1.查詢 name 等于 foo 的記錄

Model.find({ name: 'foo' })

 2.多條件查詢 查詢 name 等于 water 并且 state 等于new mexico 的記錄

1 Model.find({ name: 'walter', state: 'new mexico' })

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

User.find()
.where({ id: { '>': 100 }})
.where({ age: 21 })
.limit(100)
.sort('name')
.exec(function(err, users) {  // Do stuff here });

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

下面的修飾符可用于構(gòu)建查詢時使用。

  • '<' / '小于'

  • '<=' / '小于等于'

  • '>' / '大于'

  • '>=' / '大于等于'

  • '!' / '非'

  • 'like'/'模糊匹配'

  • 'contains'/'包含'

  • 'startsWith'/'以某字符開頭'

  • 'endsWith'/'以某字符結(jié)尾'

 3.分頁查詢

1 User.find().skip(10).limit(10); //跳過10條記錄 取10條記錄

 

1 Model.find({ where: { name: 'foo' }, skip: 20, limit: 10, sort: 'name DESC' });//帶條件分頁查詢

 

User.find().paginate({page: 2, limit: 10});//根據(jù)頁數(shù)分頁查詢

 4.新增記錄

User.create({Id:'xxx',Name:'xxx'});

 

5.更新記錄

User.update({ name: 'Walter Jr' }, { name: 'Flynn' })

 

6.刪除記錄

User.destroy({ name: 'Flynn' })

Promises

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 User.findOne() 2 .where({ id: 2 }) 3 .then(function(user){ 4     var comments = Comment.find({userId: user.id}).then(function(comments){ 5         return comments; 6     }); 7     return [user.id, user.friendsList, comments]; 8 }).spread(function(userId, friendsList, comments){ 9     // Promises are awesome! 10 }).catch(function(err){11     // An error occurred 12 })

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

七.使用示例

這里使用的數(shù)據(jù)庫是mysql創(chuàng)建一個數(shù)據(jù)庫名為:IcbcGold

1.新建一個js文件:waterline.js,代碼如下:

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 1 var mysqlAdapter = require('sails-mysql'); 2 var Waterline = require('waterline'); 3  4 var icbcgold = require('../models/IcbcGold') 5  6 //適配器與連接設(shè)置 7 var wlconfig = { 8     adapters: { 9         mysql: mysqlAdapter, //mysql適配器10         default: 'mysql' //默認(rèn)的適配器11     },12     connections: {13         //mysql連接14         mysql: {15             adapter: 'mysql',//指定適配器為mysql16             url: 'mysql://root:@localhost/IcbcGold' //連接字符串17         }18     }19 }20 21 var orm = new Waterline();22 23 //加載model集合24 orm.loadCollection(icbcgold);25 26 exports.orm = orm;27 exports.wlconfig = wlconfig;

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

2.新建文件 index.js

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

var waterline = require('./app/config/waterline');var uuid = require('uuid');var ormmodels = null;//初始化waterlinewaterline.orm.initialize(waterline.wlconfig, function (err, models) {    if (err) {        return;
    }
    ormmodels = models.collections;
})

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

//執(zhí)行查詢ormmodels.icbcgold.count({ DataTime: dataTime }).exec(function (err, found) {        if (err) {            return;
        }        if (found === 0) {
            ormmodels.icbcgold.create({ Id: uuid.v1(), DataTime: dataTime, DataNumber: dataNumber }, function (err, models) {                if (err) {                    return;
                }
            });
        }
    });

平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),游戲開發(fā),動畫培訓(xùn)

 呼~~~~終于寫完了,下面帖幾個網(wǎng)址,如果你有什么問題可以先查看

http://sailsjs.com/documentation/reference/waterline-orm/models

https://www.npmjs.com/package/waterline

waterline使用是非常簡單的,目前用nodejs寫了一個爬蟲,使用waterline存儲數(shù)據(jù)到mysql,已經(jīng)部署到服務(wù)器上,使用pm2運(yùn)行,抓取數(shù)據(jù)用的是superagent,后面我會繼續(xù)寫如果用nodejs寫爬蟲,歡迎關(guān)注!

http://www.cnblogs.com/stulzq/p/7206277.html