5.持久化数据存储

时间:2021-1-8 作者:admin

文件系统和数据库系统的对比

  • 文件系统用文件来保存数据,不宜共享;数据库系统用数据库统一存储数据
  • 文件系统中的程序(代码)和数据有一定的联系;数据库系统中的程序和数据分离
  • 文件系统存储数据不安全

数据库分类

  • 非关系型数据库
    • MongoDB等
  • 关系型数据库
    • MySQL等

Node.js实现对文件内容的增删查改

const readline = require('readline');
const fs = require('fs');
const FILEPATH = './db/my.json'

const rl = readline.createInterface({
    input: process.stdin, //可读流
    output: process.stdout //可写流
});

function update(key, value) {
    fs.readFile(FILEPATH, 'utf8', (err, data) => {
        if (err) {
            console.log(err);
        }
        const json = JSON.parse(data);
        if (json && json[key]) {
            json[key] = value;
            fs.writeFile(FILEPATH, JSON.stringify(json), err => {
                if (err) {
                    console.log(err);
                } else {
                    console.log('写入成功');
                }
            });
        } else {
            console.log('Not Found');
        }
    })
}

function del(key) {
    fs.readFile(FILEPATH, 'utf8', (err, data) => {
        if (err) {
            console.log(err);
        }
        const json = JSON.parse(data);
        let flag = delete json[key];
        if (flag) {
            console.log('删除成功');
            fs.writeFile(FILEPATH, JSON.stringify(json), err => {
                if (err) {
                    console.log(err);
                } else {
                    console.log('写入成功');
                }
            });
        }
    })
}

function get(key) {
    fs.readFile(FILEPATH, 'utf8', (err, data) => {
        if (err) {
            console.log(err);
        }
        const json = JSON.parse(data);
        if (json && json[key]) {
            console.log(json[key]);
        } else {
            console.log('Not Found');
        }
    })
}

function set(key, value) {
    fs.readFile(FILEPATH, 'utf8', (err, data) => {
        if (err) {
            console.log(err);
        }
        //可能是空对象
        const json = data ? JSON.parse(data) : {};
        json[key] = value;
        fs.writeFile(FILEPATH, JSON.stringify(json), err => {
            if (err) {
                console.log(err);
            } else {
                console.log('写入成功');
            }
        });
    })
}

rl.on('line', (input) => {
    const [op, key, value] = input.split(' ');
    switch (op) {
        case 'set':
            set(key, value);
            break;
        case 'get':
            get(key);
            break;
        case 'del':
            del(key);
            break;
        case 'update':
            update(key, value);
            break;
        case 'exit':
            rl.close();
            break;
        default:
            console.log('没有该指令');
            break;
    }
});

rl.on('close', () => {
    console.log('退出');
    process.exit(0);
})

Node.js连接MySQL

安装依赖包:

cnpm i mysql -S

const mysql = require('mysql');

//创建连接对象
const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '******',
    database: 'db1'
})

//连接数据库
conn.connect(err => {
    if (err) {
        throw err;
    }
    console.log('连接成功');
})

//增删查改
const CREATE_SQL = `CREATE TABLE IF NOT EXISTS test(id INT NOT NULL PRIMARY KEY auto_increment,name VARCHAR(20))`;
const INSERT_SQL = `INSERT INTO test(name) VALUES(?)`;
const SELECT_SQL = `SELECT * FROM test WHERE id=?`;
const DELETE_SQL = `DELETE FROM test WHERE id=?`;

conn.query(CREATE_SQL, (error, results, fields) => {
    if (error) {
        throw error;
    }
    //参数:需要执行sql语句    填充占位符的值     回调函数
    conn.query(INSERT_SQL, ['holo'], (error, results, fields) => {
        if (error) {
            throw error;
        }
        conn.query(SELECT_SQL, [6], (error, results, fields) => {
            if (error) {
                throw error;
            }
            //查询时,results返回查询结果
            console.log(results[0].name);
            //断开连接
            conn.end(); //如果query语句有嵌套,则end()需要在最后一个query内执行
        })
    })
})

删除操作:

conn.query(DELETE_SQL, [10], (error, results, fields) => {
    if (error) {
        throw error;
    }
    //断开连接
    conn.end();
})

封装MySQL的query方法

上面的query查询层层嵌套,不仅操作繁琐,而且存在回调地狱的问题,通过async/await进行代码封装,不仅能够简化操作,而且能够解决回调地狱的问题。

mysqlConfig.js

module.exports = {
    host: 'localhost',
    user: 'root',
    password: '******',
    database: 'db1'
}

mysql.js

const mysql = require('mysql');
const mysqlConfig = require('./mysqlConfig');

module.exports = {
    query: function (sql, params) {
        return new Promise((resolve, reject) => {
            //创建连接对象
            const conn = mysql.createConnection(mysqlConfig);
            //连接数据库
            conn.connect(err => {
                if (err) {
                    throw err;
                }
                console.log('连接成功');
            });
            //格式化sql语句
            sql = mysql.format(sql, params);
            //查询
            conn.query(sql, (error, results, fields) => {
                if (error) {
                    throw reject(error);
                }
                resolve(results);
                //断开连接,必须在查询语句后面
                conn.end();
            })
        })
    }
}

Tips: 用到的format()方法

mysql的github网址

var sql = mysql.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]);
console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42

使用

const CREATE_SQL = `CREATE TABLE IF NOT EXISTS test(id INT NOT NULL PRIMARY KEY auto_increment,name VARCHAR(20))`;
const INSERT_SQL = `INSERT INTO test(name) VALUES(?)`;
const SELECT_SQL = `SELECT * FROM test WHERE id=?`;
const DELETE_SQL = `DELETE FROM test WHERE id=?`;

//导入封装好的mysql
const db = require('./db/mysql');

async function asyncQuery() {
    try {
        // const res = await db.query(CREATE_SQL);
        // const res = await db.query(INSERT_SQL, ['holo']);
        // const res = await db.query(SELECT_SQL, [1]);
        const res = await db.query(DELETE_SQL, [1]);
        console.log(res);
    } catch (error) {
        console.log(error);
    }
}

asyncQuery();
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。