这部分示例将示范SQLite3MongoDB这两种不同类型的数据库在 Node.js 中的使用方法。首先,我们要在code目录下执行mkdir 06_database命令来创建用于存放这一组示例的目录。

1. SQLite

SQLite3是一个轻量级的关系型数据库,我们在这里用它来示范 Node.js 对关系型数据库的处理。首先,在code/06_database目录下执行mkdir sqlite命令,并执行以下步骤:

  1. code/06_database/sqlite目录下执行npm install sqlite3命令,将sqlite3安装到当前示例项目中。

  2. 为控制程序按串行方式执行,需在code/06_database/sqlite目录下执行npm install async命令,将async包安装到当前示例项目中。

  3. code/06_database/sqlite目录下执行touch Sqlite.js,创建一个脚本文件,具体如下:

    const fs = require('fs')
    const sqlite3 = require('sqlite3').verbose() class SqliteDB {
    constructor(file) {
    this.db = new sqlite3.Database(file)
    const db_exist = fs.existsSync(file) if ( !db_exist ) {
    console.error('数据库文件创建成功!')
    fs.openSync(file, 'w')
    }
    } createTable(sql) {
    this.db.serialize(function() {
    this.run(sql, function(err) {
    if( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    })
    })
    } insertData(sql, objects) {
    this.db.serialize(function() {
    const stmt = this.prepare(sql)
    for ( let i = 0; i < objects.length; ++i ) {
    stmt.run(objects[i])
    } stmt.finalize()
    })
    } queryData(sql, callback, message) {
    this.db.all(sql, function(err, rows) {
    if( err !== null ) {
    return console.error('错误信息:' + err.message)
    } if( callback ) {
    callback(rows, message)
    }
    })
    } executeSql(sql) {
    this.db.run(sql, function(err) {
    if( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    })
    } close() {
    this.db.close()
    }
    } module.exports = SqliteDB
  4. code/06_database/sqlite目录下执行touch useSqlite.js,创建一个脚本文件,具体如下:

    const async = require('async')
    const SqliteDB = require('./Sqlite')
    const file = "HRDB.db"
    const sqliteDB = new SqliteDB(file) function dataDeal(objects, message) {
    console.log(message)
        for ( const i = 0; i < objects.length; ++i ) {
            console.log(objects[i])
       }
    } async.waterfall([
    function (callback) {
    // 创建表格
    const createTableSql = `
    create table if not exists HR_TABLE (
    name TEXT,
    age TEXT,
    sex TEXT,
    items TEXT
    );`
    sqliteDB.createTable(createTableSql)
    callback()
    }, function (callback) {
    // 插入数据
    const insertTileSql = `
    insert into HR_TABLE
    (name, age, sex, items)
    values(?, ?, ?, ?)`
    const arr = [
    ['凌杰', '24', '男', '看书, 看电影, 旅游'],
    ['蔓儿', '25', '女', '看书, 看电影, 写作'],
    ['张语', '32', '女', '看书, 旅游, 绘画']
    ]
    sqliteDB.insertData(insertTileSql, arr)
    callback()
    }, function (callback) {
    // 查询数据
    const querySql = 'select * from HR_TABLE'
    sqliteDB.queryData(querySql, dataDeal, '初始数据')
    callback()
    }, function (callback) {
    // 更新数据
    const updateSql = `update HR_TABLE set age = 37 where name = "凌杰"`
    sqliteDB.executeSql(updateSql)
    callback()
    }, function (callback) {
    // 查询更新后的数据
    querySql = `select * from HR_TABLE`
    sqliteDB.queryData(querySql, dataDeal, '更新后数据')
    callback()
    }, function (callback) {
    sqliteDB.close()
    callback()
    }
    ])
  5. 保存所有文件后,在code/06_database/sqlite目录下执行node useSqlite.js命令,结果如下:

2. MongoDB

MongoDB是非关系型数据库的一个典型代表,我们在这里用它来示范 Node.js 对关系型数据库的处理。在 Node.js 中操作MongoDB数据库有两个扩展包可以选择,下面我们一一来演示。首先,在code/06_database目录下执行mkdir mongodb命令,并执行以下步骤:

使用mongodb
  1. code/06_database/mongodb目录下执行npm install mongodb命令,将mongodb包安装到当前示例项目中。

  2. 为控制程序按串行方式执行,需在code/06_database/mongodb目录下执行npm install async命令,将async包安装到当前示例项目中。

  3. code/06_database/mongodb目录下执行touch useMongodb.js,创建一个脚本文件,具体如下:

    const MongoClient = require('mongodb').MongoClient
    const async = require('async')
    const server = 'mongodb://localhost:27017'
    const dbName = 'hrdb'
    const collName = 'hr_table'
    const dbPath = server + '/' + dbName MongoClient.connect(dbPath, { useNewUrlParser: true },
    function(err, db) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    } const dbo = db.db(dbName)
    console.log(dbName + '数据库创建成功') const collect = dbo.collection(collName)
    console.log(collName + '集合创建成功') async.series([
    // 控制程序串行执行 function (callback) {
    // 插入单条数据
    const data = {
    name : '杨过',
    age : '42',
    sex : '男',
    items : '看书, 喝酒, 习武'
    } collect.insertOne(data, function(err, res) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('单条数据插入成功')
    })
    callback()
    }, function (callback) {
    // 插入多条数据
    const dataArray = [
    {
    name : '小龙女',
    age : '24',
    sex : '男',
    items : '看书, 唱歌, 习武'
    },
    {
    name : '郭靖',
    age : '52',
    sex : '男',
    items : '看书, 喝酒, 习武'
    },
    {
    name : '黄蓉',
    age : '45',
    sex : '女',
    items : '看书, 绘画, 习武'
    },
    {
    name : '雅典娜',
    age : '24',
    sex : '女',
    items : '看书, 音乐, 被救'
    }
    ] collect.insertMany(dataArray, function(err, res) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('数组插入成功')
    })
    callback()
    }, function (callback) {
    // 列出所有数据
    collect. find({}).toArray(function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('列出当前集合中的所有数据:')
    console.log(result)
    })
    callback()
    }, function (callback) {
    // 更新单一数据
    const whereData = {'name' : '小龙女'}
    const updataValue = { $set: { 'sex' : '女' } }
    collect.updateOne(whereData, updataValue,
    function(err, res) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log(whereData['name'] + "的数据更新成功")
    })
    callback()
    }, function (callback) {
    // 查询指定数据
    const querystr = { 'name' : '小龙女' }
    collect. find(querystr).toArray(function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('查看更新后的' + querystr['name'] + '的数据:')
    console.log(result)
    })
    callback()
    }, function (callback) {
    // 删除指定单一数据
    const whereData = { 'name' : '黄蓉' }
    collect.deleteOne(whereData,function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log(whereData['name'] + '的数据已被删除')
    })
    callback()
    }, function (callback) {
    // 查询所有数据,并按name降序排列
    const isort = { name : -1 }
    collect. find({}).sort(isort).toArray(function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('降序排列当前集合中的所有数据:')
    console.log(result)
    })
    callback()
    }, function (callback) {
    // 删除指定多条数据
    const whereData = { 'age' : '24' }
    collect.deleteMany(whereData,function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('年龄为' + whereData['age'] + '的数据已被删除')
    })
    callback()
    }, function (callback) {
    // 查询所有数据,并按name升序排列
    const isort = { name : 1 }
    collect. find({}).sort(isort).toArray(function(err, result) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log('升序排列当前集合中的所有数据:')
    console.log(result)
    })
    callback()
    }, function (callback) {
    // 删除指定集合
    dbo.dropCollection(collName, function(err, delOK) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    if ( delOK !== null ) {
    console.log(collName + "集合已删除!")
    }
    })
    callback()
    }
    ]) db.close()
    })
  4. 保存所有文件后,在code/06_database/mongodb目录下执行node useMongodb.js命令,结果如下:

使用mongoose
  1. code/06_database/mongodb目录下执行npm install mongoose命令,将mongoose包安装到当前示例项目中。

  2. code/06_database/mongodb目录下执行touch useMongoose.js,创建一个脚本文件,具体如下:

    const server = 'mongodb://localhost:27017'
    const dbName = 'hrdb'
    const collName = 'hr_table'
    const dbPath = server + '/' + dbName
    const mongoose = require('mongoose');
    const async = require('async')
    const Schema = mongoose.Schema
    const hrSchema = new Schema({
    name : {
    type : String,
    required: true
    },
    age : {
    type : String,
    required: true
    },
    sex : {
    type : String,
    required: true
    },
    items : {
    type : String,
    required: true
    }
    })
    const hrModel = new mongoose.model('Hrobj', hrSchema)
    mongoose.connect(dbPath, {useNewUrlParser: true});
    const conn = mongoose.connection
    conn.on('error', console.error.bind(console, '连接错误:'))
    conn.on('open', console.log.bind(console, '数据库连接成功'))
    conn.on('disconnected', console.log.bind(console, '断开数据库连接')) conn.once('open', function(){
    async.series([
    function(callback) {
    // 插入单条数据
    const someone = new hrModel ({
    name : '杨过',
    age : '42',
    sex : '男',
    items : '看书, 喝酒, 习武'
    })
    someone.save(function(err, one){
    callback(err, one.name+'的数据插入成功')
    })
    }, function(callback) {
    hrModel.find(function(err, hrTable){
    callback(err, '插入一条数据后的结果:' + hrTable)
    })
    }, function(callback) {
    // 插入多条数据
    const dataArray = [
    {
    name : '小龙女',
    age : '24',
    sex : '男',
    items : '看书, 唱歌, 习武'
    },
    {
    name : '郭靖',
    age : '52',
    sex : '男',
    items : '看书, 喝酒, 习武'
    },
    {
    name : '黄蓉',
    age : '45',
    sex : '女',
    items : '看书, 绘画, 习武'
    },
    {
    name : '雅典娜',
    age : '24',
    sex : '女',
    items : '看书, 音乐, 被救'
    },
    {
    name : '阿波罗',
    age : '24',
    sex : '女',
    items : '看书, 音乐, 被救'
    }
    ] hrModel.insertMany(dataArray, function(err) {
    callback(err, '数组中的数据插入成功')
    })
    }, function(callback) {
    hrModel.find(function(err, hrTable){
    callback(err, '插入多条数据后的结果:' + hrTable)
    })
    }, function(callback) {
    hrModel.updateMany({sex:'男'}, {sex:'女'}, function(err, one){
    callback(err, '将所有男人改为女人')
    })
    }, function(callback) {
    hrModel.updateOne({name:'阿波罗'}, {sex:'男'}, function(err, one){
    callback(err, '将阿波罗的性别改为:男')
    })
    }, function(callback) {
    hrModel.find({age:'24'}, function(err, hrTable){
    callback(err, '所有年龄为24的数据:' + hrTable)
    })
    }, function(callback) {
    hrModel.findOne({age:'24'}, function(err, hrTable){
    callback(err, '第一个年龄为24的结果:' + hrTable)
    })
    }, function(callback) {
    hrModel.deleteMany({age:'24'}, function(err, hrTable){
    callback(err, '所有年龄为24数据已被删除')
    })
    }, function(callback) {
    hrModel.find({age:'24'}, function(err, hrTable){
    callback(err, '所有年龄为24的数据:' + hrTable)
    })
    }, function(callback) {
    hrModel.deleteMany({}, function(err, hrTable){
    callback(err, '所有数据已被删除')
    })
    }, function(callback) {
    hrModel.find(function(err, hrTable){
    callback(err, '删除所有数据后的结果:' + hrTable)
    })
    }, function(callback) {
    mongoose.disconnect(function(err){
    callback(err, '正在断开连接……')
    })
    }
    ], function(err, message) {
    if ( err !== null ) {
    return console.error('错误信息:' + err.message)
    }
    console.log(message)
    })
    })
  3. 保存所有文件后,在code/06_database/mongodb目录下执行node useMongoose.js命令,结果如下:

Node.js 学习笔记之四:使用数据库的更多相关文章

  1. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  2. Node.js学习笔记(3):NPM简明教程

    Node.js学习笔记(3):NPM简明教程 NPM常用操作 更新NPM版本 npm install npm -g -g,表示全局安装.我们可以指定更新版本,只需要在后面填上@版本号即可,也可以输入@ ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. Node.js学习笔记(2):基本模块

    Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...

  5. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  6. Node.js学习笔记(4):Yarn简明教程

    Node.js学习笔记(4):Yarn简明教程. 引入Yarn NPM是常用的包管理工具,现在我们引入是新一代的包管理工具Yarn.其具有快速.安全.可靠的特点. 安装方式 使用npm工具安装yarn ...

  7. Node.js学习笔记(一):快速开始

    最近接了一个node项目,虽然最后顺利完成了,但是由于第一次实战,整个过程是赶出来的,许多地方一知半解.现在项目结束了,就静下心来系统地学一学,理一理,读书不忘拿笔,既然读书了,当然就要记点东西.一方 ...

  8. Node.js学习笔记(3)——关于回调函数和函数的回调

    说明:本人是node.js的初学者,尝试向别人解释这是怎么回事是自我学习的一个好方法.如果你发现有些地方并不是那么正确,欢迎提出来让我知道以便修正,共同进步,谢过^_^.       欢迎交流,本人微 ...

  9. Node.js学习笔记——Node.js开发Web后台服务

    一.简介 Node.js 是一个基于Google Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.Node.j ...

随机推荐

  1. luogu P4884 多少个1?

    LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...

  2. SSM三大框架的整合

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 在Java后端开发领域,Spri ...

  3. zabbix监控配置一般流程

    目录 zabbix监控配置流程 1. 配置客户端 2. 配置监控 2.1 创建主机组 2.2 添加主机并加入主机组 2.3 添加监控项 2.3.1 模板的方式(不用添加触发器) 2.3.2 手动添加的 ...

  4. Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependen

    Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependen ...

  5. Pytest单元测试框架:插件-allure-pytest环境搭建并在本地生成一个测试报告

    之前写了allure-pytest的官方文档啃的内容,有些交流的朋友,实践起来没什么头绪,所以就有了这篇文章,也给自己填个坑 第一步:搭建Allure.JDK环境 1. 搭建JDK环境 不装jdk你会 ...

  6. 不能错过的分布式ID生成器(Leaf ),好用的一批!

    本文收录在个人博客:www.chengxy-nds.top,技术资料共享,同进步 不了解分布式ID的同学,先行去看<一口气说出 9种 分布式ID生成方式,面试官有点懵了>温习一下基础知识, ...

  7. spring时遇到的小问题

    最近在学习spring的时候遇到了两个小问题,在此总结一下 1.少导了所需要的包 运行测试程序,报出以下错误. 初步分析,得知是dataSource数据源没有创建成功,以为dataSource配置文件 ...

  8. CSS 定位总结

    目录 元素显示模式 元素模式 元素显示模式转换 CSS定位机制 静态定位static 相对定位relative 绝对定位absolute 固定定位fixed 粘性定位sticky 定位小结一图流 CS ...

  9. Android 开发学习进程0.15 adb cardview framelayout 控件设置状态获取焦点

    Android设备调试桥 即adb 使用adb进行无线调试的一些常用命令 adb tcpip 5555 设置调试端口为5555 防止冲突 adb shell ifconfig wlan0 查询局域网中 ...

  10. Revit二次开发——非模态窗口的事件处理

    一.起因    自己在写revit二开时,有一个Winform窗体按钮点击事件需要 触发调用事务进行处理,结果出现“异常“Starting a transaction from an external ...