教程 > sequelize 中文教程 > 阅读:18

sequelize 扩展数据类型——迹忆客-ag捕鱼王app官网

你尝试实现的类型很可能已经包含在数据类型中。 如果不包括新的数据类型,本手册将说明如何自己编写它。

sequelize 不会在数据库中创建新的数据类型。 本教程说明了如何使 sequelize 识别新数据类型,并假定这些新数据类型已在数据库中创建。

要扩展 sequelize 数据类型,请在创建 sequelize 实例之前进行。


示例

在此示例中,我们将创建一个名为 sometype 的类型,该类型将复制内置数据类型 datatypes.integer(11).zerofill.unsigned

const { sequelize, datatypes, utils } = require('sequelize');
createthenewdatatype();
const sequelize = new sequelize('sqlite::memory:');
function createthenewdatatype() {
  class sometype extends datatypes.abstract {
    // 强制性的: 在数据库中完整定义新类型
    tosql() {
      return 'integer(11) unsigned zerofill'
    }
    // 可选的: 验证器功能
    validate(value, options) {
      return (typeof value === 'number') && (!number.isnan(value));
    }
    // 可选的: sanitizer
    _sanitize(value) {
      // 强制所有数字为正
      return value < 0 ? 0 : math.round(value);
    }
    // 可选的: 发送到数据库之前的值字符串化
    _stringify(value) {
      return value.tostring();
    }
    // 可选的: 解析器,用于从数据库接收的值
    static parse(value) {
      return number.parseint(value);
    }
  }
  // 强制性的: 设置类型键
  sometype.prototype.key = sometype.key = 'sometype';
  // 强制性的: 将新类型添加到数据类型. 将其包装在 `utils.classtoinvokable` 上,
  // 以能够直接使用此数据类型,而不必调用 `new`.
  datatypes.sometype = utils.classtoinvokable(sometype);
  // 可选的: 禁用字符串化后的转义. 这样做需要你自担风险,因为这为 sql 注入提供了机会.
  // datatypes.sometype.escape = false;
}

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


postgresql

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

function createthenewdatatype() {
  // [...]
  const pgtypes = datatypes.postgres;
  // 强制性的: 映射 postgres 数据类型名称
  datatypes.sometype.types.postgres = ['pg_new_type'];
  // 强制性的: 使用自己的解析方法创建特定于 postgres 的子数据类型.
  // 解析器将动态映射到 pg_new_type 的 oid.
  pgtypes.sometype = function sometype() {
    if (!(this instanceof pgtypes.sometype)) {
      return new pgtypes.sometype();
    }
    datatypes.sometype.apply(this, arguments);
  }
  const util = require('util'); // node 包内置
  util.inherits(pgtypes.sometype, datatypes.sometype);
  // 强制性的: 创建,覆盖或重新分配特定于 postgres 的解析器
  // pgtypes.sometype.parse = value => value;
  pgtypes.sometype.parse = datatypes.sometype.parse || x => x;
  // 可选的: 添加或覆盖特定于postgres数据类型的方法,
  // 例如 tosql, escape, validate, _stringify, _sanitize...
}

范围

在postgres中定义了新的范围类型后,将其添加到 sequelize 变得很简单。

在此示例中,postgres 范围类型的名称为 sometype_range,基础 postgres 数据类型的名称为 pg_new_type。 subtypes 和 casttypes 的键是 sequelize 数据类型 datatypes.sometype.key 的键(小写)。

function createthenewdatatype() {
  // [...]
  // 添加 postgresql 范围,sometype 来自 datatype.sometype.key(小写)
  datatypes.range.types.postgres.subtypes.sometype = 'sometype_range';
  datatypes.range.types.postgres.casttypes.sometype = 'pg_new_type';
}

新范围可在模型定义中用作 datatypes.range(datatypes.sometype)datatypes.range(datatypes.sometype)

查看笔记

扫码一下
查看教程更方便
网站地图