
Sequelize是一種為 Node.js 和 io.js 提供 promise-based 的 的對象關系映射
(ORM)利耍,支持 PostgreSQL, MySQL
, MariaDB, SQLite 和 MSSQL 等數(shù)據(jù)庫管理系統(tǒng) 肚逸,同時提供 事務支持
,關系
闸婴,復制
還有其他等特性. 本文參考材料: Sequelize
對象關系映射(英語:Object Relational Mapping鬼店,簡稱ORM),是一種程序設計技術(shù),用于實現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換秋冰。從效果上說,它其實是創(chuàng)建了一個可在編程語言里使用的“虛擬對象數(shù)據(jù)庫”婶熬。
</br>
例子( mysql 為例 )
var Sequelize = require('sequelize');
var sequelize = new Sequelize('database', 'username', 'password');
var User = sequelize.define('user', {
username: Sequelize.STRING,
birthday: Sequelize.DATE
});
sequelize.sync().then(function() {
return User.create({
username: 'janedoe',
birthday: new Date(1980, 6, 20)
});
}).then(function(jane) {
console.log(jane.get({
plain: true
}));
});
</br>
安裝
$ npm install --save sequelize
$ npm install --save mysql
</br>
建立連接
var sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
/* 數(shù)據(jù)庫類型 */
dialect: 'mysql'
});
</br>
第一個模型
定義模型: sequelize.define('name', {attributes}, {options})
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
/* User模型擁有firstName屬性剑勾,在數(shù)據(jù)庫中相應的屬性為first_name */
field: 'first_name'
},
lastName: {
type: Sequelize.STRING
}
}, {
/* 數(shù)據(jù)庫表名與模型名字一致 */
freezeTableName: true
});
User.sync({force: true}).then(function () {
// Table created
return User.create({
firstName: 'kayor',
lastName: 'lien'
});
});
</br>
</br>
按照以前的習慣,我們可能會通過下面這種方式來獲取user
.
// DON'T DO THIS !!!
user = User.findOne()
console.log(user.get('firstName'));
</br>
然而這行不通(不信去試試??)
為什么呢? 接下來引入一個概念
Promises
Sequelize 使用 Promises 控制異步流。 可以看看 Promises -解決Node無限回調(diào)
Promises的核心是一個 promise 代表了異步運算的結(jié)果赵颅,它有三種狀態(tài):
- pending - promise 的初始狀態(tài)(即將發(fā)生)
- fulfilled - 一次成功運算后 promise 的狀態(tài)
- rejected - 一次失敗運算后 promise 的狀態(tài)
function readFile(filename, enc){
/*
*使用 new promise 構(gòu)建一個新的 promise */
return new Promise(function (fulfill, reject){
fs.readFile(filename, enc, function (err, res){
if (err) reject(err); //失敗運算
else fulfill(res); //成功運算
});
});
}
`user`是一個 promise 對象虽另, 不是數(shù)據(jù)庫的對象,正確的打開姿勢是性含,在獲取到`user`的狀態(tài)(如 fulfilled, rejected )后洲赵,對其進行操作:
User.findOne().then(function (user) {
console.log(user.get('firstName'));
});