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写爬虫,欢迎关注!

时间: 2024-12-11 23:01:39

nodejs-ORM 操作数据库中间件waterline的使用的相关文章

?laravel使用ORM操作数据库

laravel使用ORM操作数据库 public function mode(){ //查询所有 $isok=Student::get(); 新增. (1) $isok=Student::create([ 'name'=>'123','pwd'=>'123' ]); (2) $stu=new Student(); $stu->name="123"; $stu->pwd="ww"; $isok= $stu->save(); //修改 $i

Django的orm操作数据库

Django的orm操作数据库 django学习链接:https://www.cnblogs.com/clschao/articles/10526431.html 单表操作学习链接:https://www.cnblogs.com/clschao/articles/10427807.html about mvc或者mvc框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,

nodejs mysql 操作数据库方法二

node.js 开发指南 – Node.js 连接 MySQL 并进行数据库操作 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 MySQL 数据库. Node.js是一套用来编写高性能网络服务器的JavaScript工具包 通常在NodeJS开发中我们经常涉及到操作数据库,尤其是 MySQL ,作为应用最为广泛的开源数据库则成为我们的首选,本篇就来介绍下如何通过NodeJS来操作 M

nodejs mysql 操作数据库方法一详解

nodejs mysql 数据查询例子 时间 2014-11-11 15:28:01  姜糖水原文  http://www.cnphp6.com/archives/59864 1.安装nodejs 2.安装mysql  npm包 地址:https://github.com/felixge/node-mysql npm install mysql 3.相应API查看及调用: var mysql = require('mysql'); var connection = mysql.createCon

Django ORM操作数据库常用API

昨天晚上,我们完成了一个简单的实例来对数据库表进行操作.今天,我们要熟悉更多的API,实现更复杂的功能.这一步完成了,我们对小型数据的操作问题也就不大了. 现在,我们还是参考django官方文档,来进行学习 1.构造数据表 把以下内容,拷贝到你的朋友charm中,然后执行migrate命令 class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField() def __str__

Laravel使用Eloquent ORM操作数据库

1.定义模型 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Flight extends Model{ protected $table = 'my_flights'; protected $primaryKey = 'my_id'; public $timestamps = false; } 2.获取表中所有数据all/get $flights = Flight::all();$flights = App\

django框架基础-ORM操作-长期维护-20191213

###############    ORM介绍和使用mysql的基本配置    ################ # ORM简介 # O是object,对象 # R是relation,关系,这是关系数据库中的表 # M是mapping,映射 # 在django里面主要是在models.py文件里面设计模型类, ########################### # ORM另一个作用:根据设计的类生成数据库中的表 # django中使用ORM创建表 # 这种可以使用写Python语句,然后自

nodejs+sequelize操作mysql数据库

前言: 本人对mysql不是很熟悉,只会命令行的简单增删改查.有些观点可能不到位请谅解. sequelize是针对node.js和io.js开发的基于ORM的框架,它支持的数据库包括:PostgreSQL. MySQL.MariaDB. SQLite 和 MSSQL. 目录: 1.安装mysql 2.创建目录及文件 3.连接数据库并定义模型 4.操作数据库(增删改查) 5.sequelize框架的API泛解 1.安装mysql 安装环境:win7 x64 先去官网下载最新的版本的mysql,进入

Django入门 &#160; 数据库的ORM操作之一对多

Django对数据库的是通过ORM实现.什么叫做ORM呢?简单来说,我们通过sql语句查询一张表的所有数据的语句如下  select * from test.而Django中用到的表都是在models.py文件里定义.所以我们要查查询test表里的数据可以通过 test_obj = models.test.objects.all()来获取test表里所有数据的对象.再通过 test_obj.values()方法将每一行数据的里的各个字段以key和value的字典形式读取出来.这就叫ORM操作.