Node下的数据库操作——Sequelize

来源:互联网 发布:虚拟机快照限时软件 编辑:程序博客网 时间:2024/06/10 08:23

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中使用匿名函数立即执行的方式进行运行,在实际开发中应当分成不同模块暴露接口供其他模块调用即可。

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

阅读全文
0 0