如何在Sequelize ORM中添加自定义DataType

时间:2016-01-04 02:50:22

标签: javascript node.js postgresql sequelize.js

我希望通过继承现有Sequelize的所有默认行为,在DataType.Integer中定义自定义数据类型。这里的基本想法是定义一个新类型并覆盖valueOftoString方法。

Sequelize文档不包含与此主题相关的任何信息。如果有人可以帮助我,那将是非常好的。

2 个答案:

答案 0 :(得分:2)

https://github.com/sequelize/sequelize/blob/master/lib/data-types.js包含续集数据类型。

具体来说,https://github.com/sequelize/sequelize/blob/master/lib/data-types.js#L251-L273显示了DataTypes.INTEGER如何使用NUMBER.inherits(fn)从DataTypes.NUMBER继承。

那些继承自ABSTRACT。您可以覆盖继承数据类型的toString()方法,如https://github.com/sequelize/sequelize/blob/master/lib/data-types.js#L62-L64所示。

免责声明:由于未公开记录,我不确定API的稳定程度,并且由于未来可能的变化而会保持谨慎。

答案 1 :(得分:0)

在Sequelize中扩展数据类型:

class DataTypes_IP extends DataTypes.ABSTRACT {
  constructor () {
    super()
    this.key = 'IP'
  }

  toSql() {
    return 'VARBINARY(16)'
  }

  // Todo
  validate (value) {
    // const Validator = require('./utils/validator-extras').validator 
    // if (!Validator.isDate(String(value))) {
    //   throw new sequelizeErrors.ValidationError(util.format('%j is not a valid date', value)) 
    // }
    return true 
  }

  _sanitize (value) {
    return new IP(value) 
  } 

  _isChanged (value, originalValue) {

    if (value === originalValue) return false
    if (
      value instanceof IP && 
      originalValue instanceof IP && 
      value.toBuffer().equals(originalValue.toBuffer()) 
      ) {
      return false
    }
    return true
  } 

  _stringify (ip) {
    return ip.toBuffer() 
  } 
}

扩展数据类型

DataTypes.IP = DataTypes_IP

您可以在github中查看相关问题。 https://github.com/sequelize/sequelize/issues/8533