扩展数据类型

你尝试实现的类型很可能已包含在 DataTypes 中. 如果未包含新数据类型,本手册将说明如何自行编写.

Sequelize 不会在数据库中创建新的数据类型. 本教程介绍如何使 Sequelize 识别新的数据类型,并假设已在数据库中创建了这些新的数据类型.

要扩展 Sequelize 数据类型,请在创建任何实例之前执行此操作. 此示例创建一个虚拟的 NEWTYPE,它复制内置数据类型 Sequelize.INTEGER(11).ZEROFILL.UNSIGNED.

  1. // myproject/lib/sequelize.js
  2. const Sequelize = require('Sequelize');
  3. const sequelizeConfig = require('../config/sequelize')
  4. const sequelizeAdditions = require('./sequelize-additions')
  5. // 添加新数据类型的函数
  6. sequelizeAdditions(Sequelize)
  7. // 在这个例子中,创建并导出Sequelize实例
  8. const sequelize = new Sequelize(sequelizeConfig)
  9. module.exports = sequelize
  1. // myproject/lib/sequelize-additions.js
  2. module.exports = function sequelizeAdditions(Sequelize) {
  3. DataTypes = Sequelize.DataTypes
  4. /*
  5. * 创建新类型
  6. */
  7. class NEWTYPE extends DataTypes.ABSTRACT {
  8. // 强制,在数据库中完整定义新类型
  9. toSql() {
  10. return 'INTEGER(11) UNSIGNED ZEROFILL'
  11. }
  12. // 可选,验证器功能
  13. validate(value, options) {
  14. return (typeof value === 'number') && (! Number.isNaN(value))
  15. }
  16. // 可选,sanitizer
  17. _sanitize(value) {
  18. // Force all numbers to be positive
  19. if (value < 0) {
  20. value = 0
  21. }
  22. return Math.round(value)
  23. }
  24. // 可选,发送到数据库之前的值字符串
  25. _stringify(value) {
  26. return value.toString()
  27. }
  28. // 可选,解析从数据库接收的值
  29. static parse(value) {
  30. return Number.parseInt(value)
  31. }
  32. }
  33. DataTypes.NEWTYPE = NEWTYPE;
  34. // 强制,设置 Key
  35. DataTypes.NEWTYPE.prototype.key = DataTypes.NEWTYPE.key = 'NEWTYPE'
  36. // 可选, 在stringifier后禁用转义. 不建议.
  37. // 警告:禁用针对SQL注入的Sequelize保护
  38. // DataTypes.NEWTYPE.escape = false
  39. // 为了简便`classToInvokable` 允许你使用没有 `new` 的数据类型
  40. Sequelize.NEWTYPE = Sequelize.Utils.classToInvokable(DataTypes.NEWTYPE)
  41. }

创建此新数据类型后,你需要在每个数据库方言中映射此数据类型并进行一些调整.