Waterline 之因此可使用同樣的代碼來操做多種數據庫,奧妙在於其適配器。在進行配置的時候,須要設置兩方面的內容,一是具體使用哪些適配器,二是創建數據庫鏈接的時候,使用哪一個適配器。下面是使用 MongoDB/Mysql 的適配器建立一個數據庫鏈接的配置node
MongoDB:mysql
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 };
sails-mongo 爲mongo的適配器,執行命令安裝:
npm i sails-mongo --save
Mysql:sql
1 var mysqlAdapter = require('sails-mysql'); 2 var Waterline = require('waterline'); 3 4 var icbcgold = require('../models/IcbcGold') 5 6 //適配器與鏈接設置 7 var wlconfig = { 8 adapters: { 9 mysql: mysqlAdapter, //mysql適配器 10 default: 'mysql' //默認的適配器 11 }, 12 connections: { 13 //mysql鏈接 14 mysql: { 15 adapter: 'mysql',//指定適配器爲mysql 16 url: 'mysql://root:@localhost/IcbcGold' //鏈接字符串 17 } 18 } 19 }
sails-mysql 爲mysql適配器,執行命令安裝:
1 npm i sails-mysql --save
鏈接字符串說明:數據庫類型://用戶名:密碼@數據庫地址/數據庫名mongodb
執行命令安裝waterline:數據庫
npm i waterline --save
1 var Waterline = require('waterline'); 2 3 module.exports = Waterline.Collection.extend({ 4 identity: 'icbcgold', //模型名,若是沒有設置 tableName 屬性,那麼waterline默認將模型名設置爲表名 5 tableName: 'tb_IcbcGold',//指定表名 6 connection: 'mysql',//指定數據庫鏈接 7 // 是否強制模式 8 schema: false, 9 attributes: { 10 Id: { 11 type: 'string', 12 primaryKey: true 13 }, 14 DataTime: { 15 type: 'datetime' 16 }, 17 DataNumber: { 18 type: 'float' 19 } 20 } 21 });
配置至關簡單方便,相似於 Mongoose 中的 Schema。但要注意,指定屬性的字段時,使用的是一個字符串值,而不是 JavaScript 中的具體類型,目前支持的數據類型有 string
/ text
/ integer
/ float
/ date
/time
/ datetime
/ boolean
/ binary
/ array
/ json
,這個範圍要比 JavaScript 的類型範圍大。npm
除了這四個基本配置,還能夠配置校驗器,添加自定義的方法,設置生命週期回調方法等。json
注意:服務器
1.若是沒有定義主鍵,那麼waterline會爲你默認建立名爲id的主鍵,類型是整型自增加app
2.waterline自動建立表時會爲你添加 createdAt、updatedAt兩個字段,類型爲datetime,分別在insert和update操做更新字段表明的是記錄的建立時間和更新時間ide
3.若是不想自動建立列createdAt、updatedAt,那麼請設置
autoCreatedAt,autoUpdatedAt的值爲false,以下圖
4.waterline會自動根據定義的model建立表,可是若是你已經建立好了表,可是與model定義有所區別,好比字段名不同,那麼必定要注意了,請按照下圖設置,不然waterline將會刪除已經存在表且根據model從新建立,之前的數據就完蛋了
校驗器是在建立數據集合的時候指定給具體的屬性的
更多設置請查看:https://www.npmjs.com/package/waterline
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: 0 11 }, 12 createTime: { 13 type: 'date', 14 // 在某個時間點以前 15 before: '2017-12-31', 16 // 在某個時間點以後 17 after: function () { 18 return new Date(); 19 } 20 } 21 }
能夠經過waterline,來實如今進行特定操做的時候,調用自定義的方法。,在 create
/ update
/ destory
時,均有多種回調。直接提供對應的方法名,分別是:
beforeValidate
/ afterValidate
/ beforeCreate
/ afterCreate
beforeValidate
/ afterValidate
/ beforeUpdate
/ afterUpdate
beforeDestroy
/ afterDestroy
這些方法,須要在初始化數據集合的時候進行定義。
1 //values值 cb回調方法 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 },
waterline有如下查詢方法
1.查詢 name 等於 foo 的記錄
Model.find({ name: 'foo' })
2.多條件查詢 查詢 name 等於 water 而且 state 等於new mexico 的記錄
1 Model.find({ name: 'walter', state: 'new mexico' })
User.find() .where({ id: { '>': 100 }}) .where({ age: 21 }) .limit(100) .sort('name') .exec(function(err, users) { // Do stuff here });
下面的修飾符可用於構建查詢時使用。
'<'
/ '小於'
'<='
/ '小於等於'
'>'
/ '大於'
'>='
/ '大於等於'
'!'
/ '非'
'like'/'模糊匹配'
'contains'/'包含'
'startsWith'/'以某字符開頭'
'endsWith'/'以某字符結尾'
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});//根據頁數分頁查詢
4.新增記錄
User.create({Id:'xxx',Name:'xxx'});
5.更新記錄
User.update({ name: 'Walter Jr' }, { name: 'Flynn' })
6.刪除記錄
User.destroy({ name: 'Flynn' })
Promises
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 })
這裏使用的數據庫是mysql建立一個數據庫名爲:IcbcGold
1.新建一個js文件:waterline.js,代碼以下:
1 var mysqlAdapter = require('sails-mysql'); 2 var Waterline = require('waterline'); 3 4 var icbcgold = require('../models/IcbcGold') 5 6 //適配器與鏈接設置 7 var wlconfig = { 8 adapters: { 9 mysql: mysqlAdapter, //mysql適配器 10 default: 'mysql' //默認的適配器 11 }, 12 connections: { 13 //mysql鏈接 14 mysql: { 15 adapter: 'mysql',//指定適配器爲mysql 16 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;
2.新建文件 index.js
var waterline = require('./app/config/waterline'); var uuid = require('uuid'); var ormmodels = null; //初始化waterline waterline.orm.initialize(waterline.wlconfig, function (err, models) { if (err) { return; } ormmodels = models.collections; })
//執行查詢 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; } }); } });
呼~~~~終於寫完了,下面帖幾個網址,若是你有什麼問題能夠先查看
http://sailsjs.com/documentation/reference/waterline-orm/models
https://www.npmjs.com/package/waterline
waterline使用是很是簡單的,目前用nodejs寫了一個爬蟲,使用waterline存儲數據到mysql,已經部署到服務器上,使用pm2運行,抓取數據用的是superagent,後面我會繼續寫若是用nodejs寫爬蟲,歡迎關注!