文档章节

【sequelizejs实战】sequelizejs -DataTypes 添加OBJECTID类型

satanrabbit
 satanrabbit
发布于 2015/04/20 16:41
字数 767
阅读 1056
收藏 4

#sequelizejs -DataTypes 添加OBJECTID类型

##概述

在数据库的主键的编码上,sequelizejs支持自增和uuid等方式,但这些主键的定义都各有优缺点,在使用过MongoDB之后,十分欣赏mongoDB的ObjectId生成的方式,以此作为主键对于分布式的应用更加友好,因此将sequelizejs 拓展,进行支持objectID。

##引入BSON

在项目中引入BSON,建议在sequelizejs目录中进行安装。

npm install BSON -save

BSON 安装后会即时编译。因此需要提前安装编译所需的环境。

##拓展DataTypes

在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';

【更新2016-2-14】

最新版本更新,后在此处设置toSql方法,继续添加如下代码:

OBJECTID.prototype.toSql = function() {
  return 'VARCHAR(24) BINARY';
};

设置模块接口:

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 

【更新2016-2-14】

最新版本更新后不在model.js中进行设置refreshAttributes,更改为在sequelize.js中进行设置, 在Sequelize.prototype.normalizeAttribute 方法内更改为:

if (attribute.hasOwnProperty('defaultValue')) {
    if (typeof attribute.defaultValue === 'function' && (
        attribute.defaultValue === DataTypes.NOW ||
        attribute.defaultValue === DataTypes.UUIDV1 ||
        attribute.defaultValue === DataTypes.UUIDV4 ||
        attribute.defaultValue === DataTypes.OBJECTID
    )) {
      attribute.defaultValue = new attribute.defaultValue();
    }

mysql中添加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 'VARCHAR(24) BINARY';
};

修改module.exports为:

module.exports = {
  UUID: UUID,
  OBJECTID:OBJECTID
};

【更新2016-2-14】

最新版本更新后无需设置toSql方法,无需以上设置。但需要设置默认的对应的数据类型。 在lib/dialects/mysql/data-type.js 的23行左右添加:

BaseTypes.OBJECTID.types.mysql = ['VAR_STRING'];

同时在lib/dialects/mssql/data-type.js、lib/dialects/sqlite/data-type.js中进行相应的设置,可应用于mssql和sqlite中。

##使用

定义的数据模型的时候,指定typeDataTypes.STRING,设置defaultValueDataTypes.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;
};

© 著作权归作者所有

共有 人打赏支持
satanrabbit
粉丝 4
博文 27
码字总数 9691
作品 0
河西
程序员
私信 提问
sequelize 基本用法

官网 http://docs.sequelizejs.com/en/latest/ 基于orm的框架 查询 sequelize 没有封装实例集合,所以查询返回是集合时,会是一个实例的数组,此时需要手动遍历去toJSON() db .bill .findAll(...

mosaic101
2016/03/15
346
0
百度云分享爬虫

百度云分享爬虫项目 github上有好几个这样的开源项目,但是都只提供了爬虫部分,这个项目在爬虫的基础上还增加了保存数据,建立elasticsearch索引的模块,可以用在实际生产环境中,不过web模...

蓝猫163
2016/11/18
2.4K
1
Java操作 spark读写mongodb

import com.mongodb.MongoClient; import com.mongodb.MongoClientURI; import com.mongodb.client.MongoDatabase; import com.mongodb.spark.MongoConnector; import com.mongodb.spark.Mon......

Baclk5
2016/12/21
1K
1
python操作mongodb数据库

一、MongoDB 数据库操作 连接数据库 连接指定IP的数据库 插入 用 save 也可以插入 更新 更新指定一条记录 更新多条记录 update() 有几个参数需要注意: 删除 remove() 用于删除单个或全部文档...

浅夏
2013/12/02
0
0
聊聊视图层切面实现方案

前面发过一篇《谈谈应用层切面设计》,@HulkZ说看了好几遍也没看懂,然后我又拉他到小黑屋面壁思过了好几次;也有人关心个性与扩展性如何得到平衡;也有人说,悠然就会扯淡,如何实现呢?那么...

悠悠然然
2016/05/30
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Hive的三种Join方式

Hive中就是把Map,Reduce的Join拿过来,通过SQL来表示。 参考链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins Common/Shuffle/Reduce Join Reduce Join在Hiv......

GordonNemo
6分钟前
0
0
Spark学习记录(三)核心API模块介绍

spark ------------- 基于hadoop的mr,扩展MR模型高效使用MR模型,内存型集群计算,提高app处理速度。 spark特点 ------------- 速度:在内存中存储中间结果。 支持多种语言。Scala、Java、P...

我爱春天的毛毛雨
12分钟前
0
0
PHP5、PHP7安装

11月13日任务 11.10/11.11/11.12 安装PHP5 11.13 安装PHP7 PHP官网www.php.net 当前主流版本为5.6/7.1 cd /usr/local/src/ wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2 tar z......

zgxlinux
13分钟前
0
0
React 项目结构和组件命名之道

摘要: > * 原文地址:[structuring projects and naming components in react](https://hackernoon.com/structuring-projects-and-naming-components-in-react-1261b6e18d76) > * 原文作者:......

阿里云官方博客
13分钟前
1
0
无维护地稳定运行了8 年的 Hyperic HQ

最近在诊断一个系统意外停机时, 发现一个8年前部署部署的Hypeirc HQ 4.2,已经免维护,稳定运行了8年多。提供了及时的诊断信息。单击右下角的蓝色泡泡,可显示报警信息。

MartinKing
27分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部