1. 程式人生 > >Node下的資料庫操作——Sequelize

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中使用匿名函式立即執行的方式進行執行,在實際開發中應當分成不同模組暴露介面供其他模組呼叫即可。

以下是執行的結果:
這裡寫圖片描述