Sequelize是一种为 Node.js 和 io.js 提供 promise-based 的 的对象关系映射
(ORM),支持 PostgreSQL, MySQL
, MariaDB, SQLite 和 MSSQL 等数据库管理系统 ,同时提供 事务支持
,关系
,复制
还有其他等特性. 本文参考材料: Sequelize
对象关系映射(英语:Object Relational Mapping,简称ORM),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
</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',
/* 数据库类型 */
dialect: 'mysql'
});
</br>
第一个模型
定义模型: sequelize.define('name', {attributes}, {options})
var User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
/* User模型拥有firstName属性,在数据库中相应的属性为first_name */
field: 'first_name'
},
lastName: {
type: Sequelize.STRING
}
}, {
/* 数据库表名与模型名字一致 */
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无限回调
Promises的核心是一个 promise 代表了异步运算的结果,它有三种状态:
- pending - promise 的初始状态(即将发生)
- fulfilled - 一次成功运算后 promise 的状态
- rejected - 一次失败运算后 promise 的状态
function readFile(filename, enc){
/*
*使用 new promise 构建一个新的 promise */
return new Promise(function (fulfill, reject){
fs.readFile(filename, enc, function (err, res){
if (err) reject(err); //失败运算
else fulfill(res); //成功运算
});
});
}
`user`是一个 promise 对象, 不是数据库的对象,正确的打开姿势是,在获取到`user`的状态(如 fulfilled, rejected )后,对其进行操作:
User.findOne().then(function (user) {
console.log(user.get('firstName'));
});
网友评论