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();