您的位置:首页 > Web前端 > Node.js

Node下的数据库操作——Sequelize

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

以下是运行的结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 node 异步