Node下的数据库操作——Sequelize

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/riddle1981/article/details/76144002

Async/Await应该是目前最简单的异步方案了,这里我们将使用它进行数据库操作。先来说一下它的基本规则:

async 表示这是一个async函数,await只能用在这个函数里面。
await 表示在这里等待promise返回结果了,再继续执行。
await 后面跟着的应该是一个promise对象(当然,其他返回值也没关系,只是会立即执行,不过那样就没有意义了…)

这里我们选择Node的ORM框架Sequelize来操作数据库。
因为Sequelize返回的对象是Promise,所以我们可以用then()和catch()分别异步响应成功和失败。
但是用then()和catch()仍然比较麻烦。有没有更简单的方法呢?
可以用ES7的await来调用任何一个Promise对象,这样我们写出来的代码就变成了:

(async () => {
    var pets = await Pet.findAll();
})();

await等待的虽然是promise对象,但不必写.then(..),直接可以得到返回值。当我们使用await写时,既然.then(..)不用写了,那么.catch(..)也不用写,可以直接用标准的try catch语法捕捉错误。

(async () =>{
    try{
        var pets = await queryFromSomewhere("rabbit");
        for (let p of pets) {
            await p.destroy();
        }
    }catch(err)
{
    console.log(err);
}
})();

下面来看一个完整的实例:
先在config.js中写入配置文件

var config = {
    database: 'test', // 使用哪个数据库
    username: 'root', // 用户名
    password: '12345', // 口令
    host: 'localhost', // 主机名
    port: 3306 // 端口号,MySQL默认3306
};

module.exports = config;

然后就可以在app.js中操作数据库了:

const Sequelize = require('sequelize');
const config = require('./config');

//创建一个sequelize对象实例:
var sequelize = new Sequelize(config.database, config.username, config.password, {
    host: config.host,
    dialect: 'mysql',
    pool: {
        max: 5,
        min: 0,
        idle: 30000
    }
});

//定义模型Pet,告诉Sequelize如何映射数据库表:
var Pet = sequelize.define('pet', {
    id: {
        type: Sequelize.STRING(50),
        primaryKey: true
    },
    name: Sequelize.STRING(100),
    gender: Sequelize.BOOLEAN,
    birth: Sequelize.STRING(10),
    createdAt: Sequelize.BIGINT,
    updatedAt: Sequelize.BIGINT,
    version: Sequelize.BIGINT
}, {
    timestamps: false
});

//写入数据
var now = Date.now();
(async () => {
    var dog = await Pet.create({
    id: 'd-' + now,
    name: 'haha',
    gender: false,
    birth: '2008-08-08',
    createdAt: now,
    updatedAt: now,
    version: 0
});
console.log('created: ' + JSON.stringify(dog));
})();


// 查询成功后会返回包含多个实例(instance)的数组。
var queryFromSomewhere = async (animals) =>
{
    var pets = await Pet.findAll({
        where: {
            name: animals||'pig'
        }
    });
    console.log(`find ${pets.length} pets:`);
    for (let p of pets) {
        console.log(JSON.stringify(p));
    }
    return pets;

};

// 通过获取的示例进行数据更新
(async () => {
    try{
        var pets = await queryFromSomewhere("dog");
        for (let p of pets) {
            p.gender = true;
            p.updatedAt = Date.now();
            p.version++;
            await p.save();
        }
    }catch(err){
        console.log(err);
    }
})();


// 通过获取的示例进行数据更新
(async () =>{
    try{
        var pets = await queryFromSomewhere("rabbit");
        for (let p of pets) {
            await p.destroy();
        }
    }catch(err)
    {
        console.log(err);
    }
})();

因为Sequelize类是引用sequlize模块后获取一个顶级对象,我们通过它来创建sequlize实例,也可以通过该对象来获取模内其它对象的引用,如:Utils工具类、Transaction事务类等。创建实例后,可以通过实例来创建或定义Model(模型)、执行查询、同步数据库结构等操作。

首先我们要知道Model相当于数据库中表,有时它也会被称为“模型”或“工厂”。Model不能通过构造函数创建,而只能通过sequlize.define方法来定义或通过sequlize.import导入。通过define定义一个Model,就相当于定义了一种模型与数据表之间的映射关系,通过模型可以实现对表记录的增、删、改、查等操作。

因为只是简单实例就没有写暴露接口,全部堆在app.js中使用匿名函数立即执行的方式进行运行,在实际开发中应当分成不同模块暴露接口供其他模块调用即可。

以下是运行的结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/riddle1981/article/details/76144002