发布于 2015-08-31 02:28:15 | 561 次阅读 | 评论: 0 | 来源: PHPERZ
Sequelize Node.js的ORM 框架
Sequelize.js 提供对 MySQL,MariaDB,SQLite 和 PostgreSQL 数据库的简单访问,通过映射数据库条目到对象,或者对象到数据库条目。简而言之,就是 ORM(Object-Relational-Mapper)。Sequelize.js 完全是使用 JavaScript 编写,适用于 Node.js 的环境。
在数据库的主键的编码上,sequelizejs支持自增和uuid等方式,但这些主键的定义都各有优缺点,在使用过MongoDB之后,十分欣赏mongoDB的ObjectId生成的方式,以此作为主键对于分布式的应用更加友好,因此将sequelizejs 拓展,进行支持objectID。
在项目中引入BSON,建议在sequelizejs目录中进行安装。
npm install BSON -save
BSON 安装后会即时编译。因此需要提前安装编译所需的环境。
在data-type.js中添加代码:
/**
* A column storing a OBJECTID univeral identifier.
* @property OBJECTID
*/
var OBJECTID = function() {
if (!(this instanceof OBJECTID)) return new OBJECTID();
ABSTRACT.apply(this, arguments);
};
util.inherits(OBJECTID, ABSTRACT);
OBJECTID.prototype.key = OBJECTID.key = 'OBJECTID';
设置模块接口:
module.exports = {
....
OBJECTID:OBJECTID,
....
};
设置数据类型默认值 在utils.js中引入Bson模块:
var Bson=require('bson');
在utils.js中修改toDefaultValue方法:
if (typeof value === 'function') {
var tmp = value();
if (tmp instanceof DataTypes.ABSTRACT) {
return tmp.toSql();
} else {
return tmp;
}
} else if (value instanceof DataTypes.UUIDV1) {
return uuid.v1();
} else if (value instanceof DataTypes.UUIDV4) {
return uuid.v4();
} else if (value instanceof DataTypes.NOW) {
return Utils.now();
} else if (value instanceof DataTypes.OBJECTID) {
return Bson.ObjectID().toString();
} else {
return value;
}
同时将OBJECTID作为默认值时候不设置数据库的默认值,更改utils.js的defaultValueSchemable方法:
/**
* Determine if the default value provided exists and can be described
* in a db schema using the DEFAULT directive.
*
* @param {*} value Any default value.
* @return {boolean} yes / no.
*/
defaultValueSchemable: function(value) {
if (typeof value === 'undefined') { return false; }
// TODO this will be schemable when all supported db
// have been normalized for this case
if (value instanceof DataTypes.NOW) { return false; }
if (value instanceof DataTypes.UUIDV1 ||
value instanceof DataTypes.UUIDV4||
value instanceof DataTypes.OBJECTID) { return false; }
if (lodash.isFunction(value)) {
return false;
}
return true;
},
在model.js中更新model定义时的refreshAttributes方法,约776行的 definition.defaultValue === DataTypes.UUIDV4 后添加或条件:
||definition.defaultValue === DataTypes.OBJECTID
在 lib/dialects/mysql.js中的UUID.prototype.toSql的定义后添加:
UUID.prototype.toSql = function() {
return 'CHAR(36) BINARY';
};
var OBJECTID = function() {
if (!(this instanceof OBJECTID)) return new OBJECTID();
BaseTypes.OBJECTID.apply(this, arguments);
};
util.inherits(OBJECTID, BaseTypes.OBJECTID);
OBJECTID.prototype.toSql = function() {
return 'CHAR(26) BINARY';
};
修改module.exports为:
module.exports = {
UUID: UUID,
OBJECTID:OBJECTID
};
定义的数据模型的时候,指定type
为DataTypes.STRING
,设置defaultValue
为DataTypes.OBJECTID
,插入数据库时候会将默认值生成OBJECTID格式的字符串;
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
id:{
type: DataTypes.OBJECTID,
defaultValue: DataTypes.OBJECTID,
primaryKey: true, // 定义主键
comment: "OBJECTID主键"
},
name: {
type:DataTypes.STRING, //字符串,默认长度 255,
comment: "用户姓名"
},
account: {
type:DataTypes.STRING,
validate: {
isEmail: {
msg: "用户账号必须是邮箱!"
},
},
comment: "用户账号,使用邮箱注册"
},
pwd: {
type:DataTypes.STRING,
comment: "用户密码,使用MD5"
}
);
return User;
};