nodejs-ORM 操作數據庫中間件waterline的使用


waterline和Sails.js同一團隊開發,支持幾乎所有的主流數據庫,是nodejs下一款非常強大的orm,可以顯著提升開發效率

 

一.waterline支持的數據庫

 

 

二.waterline的配置

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

MongoDB:

 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:

 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

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

三.waterline的Model的定義

執行命令安裝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 的類型范圍大。

除了這四個基本配置,還可以配置校驗器,添加自定義的方法,設置生命周期回調方法等。

 

注意:

  1.如果沒有定義主鍵,那么waterline會為你默認創建名為id的主鍵,類型是整型自增長

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

  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寫爬蟲,歡迎關注!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM