在使用NodeJS來關係型操做數據庫時,爲了方便,一般都會選擇一個合適的ORM(Object Relationship Model)框架。畢竟直接操做SQL比較繁瑣,經過ORM框架,咱們可使用面向對象的方式來操做表。mysql
$ 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 } } );
# 用戶信息表 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
建表SQL會自動執行的意思是你主動調用sync的時候。相似這樣:User.sync({force: true});(加force:true,會先刪掉表後再建表)。咱們也能夠先定義好表結構,再來定義Sequelize模型,這時能夠不用sync。二者在定義階段沒有什麼關係,直到咱們真正開始操做模型時,纔會觸及到表的操做,可是咱們固然仍是要儘可能保證模型和表的同步(能夠藉助一些migration工具)。數據庫
經過Sequelize獲取的模型對象都是一個DAO(Data Access Object)對象,這些對象會擁有許多操做數據庫表的實例對象方法(好比:save、update、destroy等),須要獲取「乾淨」的JSON對象能夠調用get({'plain': true})。npm
經過模型的類方法能夠獲取模型對象(好比: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();