learning sequelize

learningCoder發表於2019-02-16

sequelize入門

在使用NodeJS來關係型運算元據庫時,為了方便,通常都會選擇一個合適的ORM(Object Relationship Model)框架。畢竟直接操作SQL比較繁瑣,通過ORM框架,我們可以使用物件導向的方式來操作表。

安裝

$ npm install --save co
$ npm install --save sequelize
$ npm install --save mysql

程式碼模板

var Sequelize = require(`sequelize`);
var co = require(`co`);

co(function* () {
    // code here
}).catch(function(e) {
    console.log(e);
});

建立資料庫連線

var sequelize = new Sequelize(
    `db_entry`, // 資料庫名
    `root`,   // 使用者名稱
    ``,   // 使用者密碼
    {
        `dialect`: `mysql`,  // 資料庫使用mysql
        `host`: `localhost`, // 資料庫伺服器ip
        `port`: 3306,        // 資料庫伺服器埠
        `define`: {
            // 欄位以下劃線(_)來分割(預設是駝峰命名風格)
            `underscored`: true
        }
    }
);

建立表ORM

# 使用者資訊表
create TABLE xxts_users(
id INT(11) NOT NULL AUTO_INCREMENT,
username varchar(30) NOT NULL,
password VARCHAR(30) NOT NULL,
sex INT(2) NOT NULL DEFAULT 1,
age VARCHAR(10) NULL,
photo VARCHAR(30) NULL,
realname VARCHAR(30) NULL,
created_at DATETIME NOT NULL, 
updated_at DATETIME NOT NULL,
PRIMARY KEY (id)
);
var User = sequelize.define(
    // 這個值還會作為訪問模型相關的模型時的屬性名,所以建議用小寫形式
    `xxts_users`,
    // 欄位定義(主鍵、created_at、updated_at預設包含,不用特殊定義)
    {
        `username`: {
            `type`: Sequelize.STRING(30),
            `allowNull`: false
        },
        `password`: {
            `type`: Sequelize.STRING(30),
            `allowNull`: false
        },
        `sex`: {
            `type`: Sequelize.INTEGER(2),
            `allowNull`: false
        },
        `age`: {
            `type`: Sequelize.STRING(10),
            `allowNull`: true
        },
        `photo`: {
            `type`: Sequelize.STRING(30),
            `allowNull`: true
        },
        `realname`: {
            `type`: Sequelize.STRING(30),
            `allowNull`: true
        }
    },
    {
        // 自定義表名
        `freezeTableName`: true,
        `tableName`: `xxts_users`,

        // 是否需要增加createdAt、updatedAt、deletedAt欄位
        `timestamps`: true,

        // 不需要createdAt欄位
        // `createdAt`: false,
        // 將updatedAt欄位改個名
        //`updatedAt`: `utime`
        // 將deletedAt欄位改名
        // 同時需要設定paranoid為true(此種模式下,刪除資料時不會進行物理刪除,而是設定deletedAt為當前時間
        // `deletedAt`: `dtime`,
        // `paranoid`: true
    }
);

說明:

建表SQL會自動執行的意思是你主動呼叫sync的時候。類似這樣:User.sync({force: true});(加force:true,會先刪掉表後再建表)。我們也可以先定義好表結構,再來定義Sequelize模型,這時可以不用sync。兩者在定義階段沒有什麼關係,直到我們真正開始操作模型時,才會觸及到表的操作,但是我們當然還是要儘量保證模型和表的同步(可以藉助一些migration工具)。

增刪改查

通過Sequelize獲取的模型物件都是一個DAO(Data Access Object)物件,這些物件會擁有許多運算元據庫表的例項物件方法(比如:save、update、destroy等),需要獲取“乾淨”的JSON物件可以呼叫get({`plain`: true})。

通過模型的類方法可以獲取模型物件(比如:findById、findAll等)。

// 增加
function user_add() {
  co(function*() {
    var user = yield User.create({
      username: "小明",
      password: "技術部",
      sex: 2,
      age: 32,
      photo: "photo.jpg",
      realname: "admin"
    });
    console.log(user.get({ plain: true }));
  }).catch(function(e) {
    console.log(e);
  });
}

// 修改
function user_update(){
    co(function*() {
        var user = yield User.update({
            username: "小白白"
        },{
            where:{
                id:1
            }
        });
        console.log("更新成功");
    }).catch(function(e) {
        console.log(e);
    });
}

// 刪除
function user_destroy(){
    co(function*() {
        var user = yield User.destroy({
            where:{
                id:1
            }
        });
        console.log("刪除成功");
    }).catch(function(e) {
        console.log(e);
    });
}

// 查詢
function user_query(){
    co(function*() {
        var user = yield User.findAll().spread(function(item, created){
            console.log(item.get({ plain: true }));
        });
    }).catch(function(e) {
        console.log(e);
    });
}

user_query();

相關文章