NodeJs 关系数据库ORM库:Bookshelf.js

bookshelf.js是基于knex的一个关系型数据库的ORM库。简单易用,内置了Promise的支持。这里主要罗列一些使用的例子,例子就是最好的教程。下面就是用mysql作为实例数据库表明bookshelf如何使用。其他的几个关系型数据库使用上基本一致,只是配置等地方需要使用的名称各自不同。为了更加贴近实际全部的例子都会放在Express打造的RESTful服务里。

安装bookshelf和knex

首先需要安装库knex和bookshelf,其次还需要安装你的数据库对应的包:

npm install knex --save
npm install bookshelf --save

接下来,安装对应于你要使用的数据库的driver包。下面列出了三个比较典型的,只需要选择一个安装就可以。

npm install pg --save       // PostgreSQL
npm install mysql --save // MySQL
npm install sqlite3 --save // SQLite

连接数据库

连接数据库就是非常的简单的,只需要传入一个JSON格式的配置:

var knex        = require('knex'),
db; // 数据库连接 // 数据库连接配置
var config = {
client: 'mysql', // 其他可以是pg、sqlite3
connection: {
host: 'localhost',
user: 'root',
password: '123456',
database: 'petshop', // 数据库名称
charset: 'utf8'
}
}; // 保证数据库连接只初始化一次。
if (!db) {
db = knex(config);
}

接下来就该让bookshelf出马了:

var bookshelf = require('bookshelf')(db);

正式开始前,假设你现在有这么两个表Pet和User,分别存储宠物和宠物店的用户数据:

--pet
CREATE TABLE `pet` (
`petId` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`type` int(11) DEFAULT NULL,
`quantity` int(11) DEFAULT NULL,
`userId` int(11) NOT NULL, -- 外键,和哪个用户关联
PRIMARY KEY (`petId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1; --user
CREATE TABLE `user` (
`userId` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) DEFAULT NULL,
`password` varchar(45) DEFAULT NULL,
`email` varchar(105) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Express打造的RESTful服务代码:

var Promise     = require('bluebird'),
express = require('express'),
bodyParser = require('body-parser'),
session = require('express-session'); var app = express(); app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true})); app.use(session({
secret: 'abcdefghijklmnopqrstuvwxyz1234567890',
resave: false,
saveUninitialized: true
// cookie: {secure: true}
})); var models = require('./bookshelf');
var router = express.Router(); router.get('/', function(req, res) {
res.send('Hello bookshelf');
}); /**
* 添加
*/
router.route('/add').post(function(req, res) {
// ...
}); /**
* 更新
*/
router.route('/update').post(function(req, res) {
// ...
}); app.use('/bookshelf', router); app.listen(4000, function(){
console.log('express is running on http://localhost:4000');
});

为了正常使用还需要安装某些包body-parser,这个包用来解析post发送上来的数据。bluebirdexpress-session什么的可以选择不装,不影响。

Model

ORM,这model是必须不可以少的。如何让model来对应于数据库的table呢:

var Pet = bookshelf.Model.extend({
tableName: 'pet',
});

现在就可以使用Pet来处理pet表的数据了。

上面是理论上的。回到本例中。首先在根目录下创建一个文件夹bookshelf,然后添加文件model.js

添加数据

给表添加一条记录:

new Pet({
name: 'King',
type: 1, // 1: dog, 2: cat...
quantity: 10,
userId: 123456
}).save().then(function(model){
console.log(model);
}).catch(function(err) {
console.log(err);
});

放在RESTful API里:

router.route('/add').post(function(req, res) {
var pet = new models.Pet({
name: req.body.name,
type: req.body.type,
quantity: req.body.quantity,
userId: req.body.userId
}); pet.save().then(function(model){
res.json({message:'done', data: pet});
}).catch(function(err){
res.json({message: 'error', data: err});
});
});

在处理数据的时候可以使用bookshelf提供的很多“静态方法”。上面的extend就是这些静态方法中的一个。创建新的model的时候就可以是用静态方法里的一个forge,这样就不用new的方式了。

    models.Pet.forge({
name: req.body.name,
type: req.body.type,
quantity: req.body.quantity,
userId: req.body.userId
}).save().then(function(pet){
res.json({message:'done', data: pet});
}).catch(function(err){
res.json({message: 'error', data: err});
});

查找数据

添加了数据就可以查找出来了。

查找全部

查找全部的数据:

router.route('/findall').get(function(req, res) {
models.Pet.forge().fetchAll().then(function(pets) {
res.json({message: 'done', data: pets});
}).catch(function(err) {
res.json({message: 'error', data: err});
});
});

在浏览器里输入地址:http://localhost:4000/bookshelf/findall可以查找出全部的pet数据。

查找某一个Pet

router.route('/find/:petId').get(function(req, res) {
models.Pet.forge({
petId: req.params.petId
}).fetch().then(function(pet) {
res.json({message: 'done', data: pet});
}).catch(function(err) {
res.json({message: 'error', data: err});
});
});

在浏览器里输入地址:http://localhost:4000/bookshelf/find/1可以查找出petId为1的数据。

我们在上一个例子中已经创建了一条记录,所以现在可以搜出来一条记录。

更多的更复杂的查找可以使用方法query,查看这里了解更多。

更新数据

更新和创建一条新纪录,在写法上没什么太大的区别。只不过你需要在save方法里设置需要更新的数据。但是有一个限制条件,就是需要在forge方法里给出id,必须是这个词id。如果你的Primary key不是这个名称,那么就稍微复杂一点了。必须给出where条件,比如:

router.route('/update/:petId').post(function(req, res) {
models.Pet.forge()
.where('petId', '=', req.params.petId)
.save({
name: req.body.name,
type: req.body.type,
quantity: req.body.quantity,
userId: req.body.userId
}, {patch: true}).then(function(pet) {
res.json({message: 'done', data: pet});
}).catch(function(err) {
res.json({message: 'error', data: err});
});
});

更多关于where内容可以查看这里

删除记录

最后可以删除记录。

router.route('/delete/:petId').get(function(req, res) {
models.Pet.forge()
.where('petId', '=', req.params.petId)
.destroy()
.then(function(pet) {
res.json({message: 'done', data: pet});
})
.catch(function(err) {
res.json({message: 'error', data: err});
});
});

最后

bookshelf这个库非常好用。不过这些还只是比较常用的一部分功能。还有很多的关系数据库的一对一、一对多以及多对多的关系的处理。

这些都可以在官方文档中查找到。

Node的关系型数据库ORM库:bookshelf的更多相关文章

  1. django model Foreign key usage 关系型数据库 ORM

    django 的模型 from django.db import models""" A model pair to map car and its manufactur ...

  2. sqlyog管理关系型数据库mysql数据库之sqlyog的安装管理

    .关系型数据库 有库有表,有关系 非关系型数据库  存储对象.集 下面的所有演示截图都是基不超过SQLyog 11进行的. 1. 2.点击上图中的应用程序,进行安装. 安装sqlyog , 账户dd0 ...

  3. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库

    一.依赖注入DI 通过依赖注入降低View.服务.资源简化初始化.事件绑定等反复繁琐工作 AndroidAnnotations(Code Diet) android高速开发框架 项目地址:https: ...

  4. MySQL(一) -- MySQL学习路线、数据库的基础、关系型数据库、关键字说明、SQL、MySQL数据库、MySQL服务器对象、SQL的基本操作、库操作、表操作、数据操作、中文数据问题、 校对集问题、web乱码问题

    1 MySQL学习路线 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图.触发器.函数.存储过程等). 优化阶段:如何提高数据库的效率,如索引,分表等. 部署阶段:如何搭建真实 ...

  5. Daject初探 - 一个开源关系型数据库对象关系映射(ORM)模型

    Daject简介 Daject是用php写的一个关系型数据库抽象模型,通过该模型,可以在不写任何SQL或写很少的SQL就能执行大多数数据库查询操作.Daject具有面向对象,跨数据库的优点,通过数据库 ...

  6. 非关系型数据库(NoSql)

    最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...

  7. 数据库ORM框架GreenDao

    常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...

  8. Jetpack 架构组件 Room 数据库 ORM MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 《Andorid开源》greenDao 数据库orm框架

       一 前言:以前没用框架写Andorid的Sqlite的时候就是用SQLiteDatabase ,SQLiteOpenHelper ,SQL语句等一些东西,特别在写SQL语句来进行 数据库操作的时 ...

随机推荐

  1. SqlServer中的数据库分类

    1.系统数据库(中央管理机构):用来管理用户创建用户数据的数据库. 系统数据库中包含如下数据库: (1)master:记录了sqlserver中所有系统级别的信息,包括所有的登录账户.系统配置,还有其 ...

  2. android 开发概述以及相关背景知识

    参考链接:http://www.runoob.com/android/android-architecture.html http://www.runoob.com/android/android-a ...

  3. 转:css知多少(12)——目录

    <css知多少>系列就此完结了.常来光顾的朋友可能会觉得突然:css的知识点还有很多,怎么突然就完了,还没讲完呢?这样说是对的.不过凡事都有一个定位,如果盲目求多,定位模糊,那样就没有目的 ...

  4. 如何在Fragment中获取context

    文章转载自http://blog.csdn.net/demonliuhui/article/details/51511136 这里仅供自己学习参考: Context,中文直译为“上下文”,SDK中对其 ...

  5. 为什么CNN能自动提取图像特征

    1.介绍 在大部分传统机器学习场景里,我们先经过特征工程等方法得到特征表示,然后选用一个机器学习算法进行训练.在训练过程中,表示事物的特征是固定的. 后来嘛,后来深度学习就崛起了.深度学习对外推荐自己 ...

  6. PAT 1038 统计同成绩学生(20)(代码)

    1038 统计同成绩学生(20)(20 分) 本题要求读入N名学生的成绩,将获得某一给定分数的学生人数输出. 输入格式: 输入在第1行给出不超过10^5^的正整数N,即学生总人数.随后1行给出N名学生 ...

  7. iOS.Location-Based Service

    基于位置区域的服务 1. 背景 Ref[1] 在iOS设备锁屏的状态下,App的icon会出现在屏幕的左下角. iOS 8 Feature: Location-based Lockscreen App ...

  8. gerrit管理下的git代码提交小技巧

    1.提交代码git checkout targetbranch 切换至目标分支git pull origin targetbranch 拉取目标分支最新内容git add 修改文件git commit ...

  9. linux通过python设置系统默认编码

    import sys sys.reload() sys.getdefaultencoding() # 查看设置前系统默认编码 sys.setdefaultencoding('utf-8') sys.g ...

  10. Java时代即将来临

    Java语言开发成型的时候有一个构想:就是智能设备互联,笔者推断这个时代即将来临. 我们看看信息时代经历的几个阶段: 机械设备阶段--以算盘.机械式计算机为代表的萌芽阶段. 电子管计算机阶段--以简单 ...