Node下的資料庫操作——Sequelize
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中使用匿名函式立即執行的方式進行執行,在實際開發中應當分成不同模組暴露介面供其他模組呼叫即可。
以下是執行的結果: