PostgreSQL

假设在 postgres 数据库中新数据类型的名称是pg_new_type. 该名称必须映射到DataTypes.NEWTYPE. 此外,还需要创建 postgres 特定的子数据类型.

  1. // myproject/lib/sequelize-additions.js
  2. module.exports = function sequelizeAdditions(Sequelize) {
  3. DataTypes = Sequelize.DataTypes
  4. /*
  5. * 创建新类型
  6. */
  7. ...
  8. /*
  9. * 映射新类型
  10. */
  11. // 强制, 映射 postgres 数据类型名称
  12. DataTypes.NEWTYPE.types.postgres = ['pg_new_type']
  13. // 强制, 使用自己的 parse 方法创建 postgres 特定的子数据类型. 解析器将动态映射到 pg_new_type 的 OID.
  14. PgTypes = DataTypes.postgres
  15. PgTypes.NEWTYPE = function NEWTYPE() {
  16. if (!(this instanceof PgTypes.NEWTYPE)) return new PgTypes.NEWTYPE();
  17. DataTypes.NEWTYPE.apply(this, arguments);
  18. }
  19. inherits(PgTypes.NEWTYPE, DataTypes.NEWTYPE);
  20. // 强制, 创建,覆盖或重新分配postgres特定的解析器
  21. //PgTypes.NEWTYPE.parse = value => value;
  22. PgTypes.NEWTYPE.parse = DataTypes.NEWTYPE.parse;
  23. // 可选, 添加或覆盖 postgres 特定数据类型的方法
  24. // 比如 toSql, escape, validate, _stringify, _sanitize...
  25. }

范围

postgres中定义新的范围类型之后, 将它添加到Sequelize是微不足道的.

在这个例子中,postgres范围类型的名称是newtype_range,底层postgres数据类型的名称是pg_new_type. subtypescastTypes的关键是Sequelize数据类型DataTypes.NEWTYPE.key的关键字,小写.

  1. // myproject/lib/sequelize-additions.js
  2. module.exports = function sequelizeAdditions(Sequelize) {
  3. DataTypes = Sequelize.DataTypes
  4. /*
  5. * 创建新类型
  6. */
  7. ...
  8. /*
  9. * 映射新类型
  10. */
  11. ...
  12. /*
  13. * 添加范围支持
  14. */
  15. // 添加 postgresql 范围,newtype 来自 DataType.NEWTYPE.key,小写
  16. DataTypes.RANGE.types.postgres.subtypes.newtype = 'newtype_range';
  17. DataTypes.RANGE.types.postgres.castTypes.newtype = 'pg_new_type';
  18. }

新范围可以在模型定义中用作 Sequelize.RANGE(Sequelize.NEWTYPE)DataTypes.RANGE(DataTypes.NEWTYPE).