跳至主要內容
版本:v6 - 穩定版

擴展資料類型

您嘗試實作的類型很可能已包含在 DataTypes 中。如果未包含新的資料類型,本手冊將說明如何自行撰寫。

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 {
// Mandatory: complete definition of the new type in the database
toSql() {
return 'INTEGER(11) UNSIGNED ZEROFILL';
}

// Optional: validator function
validate(value, options) {
return typeof value === 'number' && !Number.isNaN(value);
}

// Optional: sanitizer
_sanitize(value) {
// Force all numbers to be positive
return value < 0 ? 0 : Math.round(value);
}

// Optional: value stringifier before sending to database
_stringify(value) {
return value.toString();
}

// Optional: parser for values received from the database
static parse(value) {
return Number.parseInt(value);
}
}

// Mandatory: set the type key
SOMETYPE.prototype.key = SOMETYPE.key = 'SOMETYPE';

// Mandatory: add the new type to DataTypes. Optionally wrap it on `Utils.classToInvokable` to
// be able to use this datatype directly without having to call `new` on it.
DataTypes.SOMETYPE = Utils.classToInvokable(SOMETYPE);

// Optional: disable escaping after stringifier. Do this at your own risk, since this opens opportunity for SQL injections.
// DataTypes.SOMETYPE.escape = false;
}

建立此新的資料類型後,您需要在每個資料庫方言中對此資料類型進行對應,並進行一些調整。

PostgreSQL

假設 postgres 資料庫中新資料類型的名稱為 pg_new_type。該名稱必須對應到 DataTypes.SOMETYPE。此外,還需要建立一個特定於 postgres 的子資料類型。

function createTheNewDataType() {
// [...]

const PgTypes = DataTypes.postgres;

// Mandatory: map postgres datatype name
DataTypes.SOMETYPE.types.postgres = ['pg_new_type'];

// Mandatory: create a postgres-specific child datatype with its own parse
// method. The parser will be dynamically mapped to the OID of pg_new_type.
PgTypes.SOMETYPE = function SOMETYPE() {
if (!(this instanceof PgTypes.SOMETYPE)) {
return new PgTypes.SOMETYPE();
}
DataTypes.SOMETYPE.apply(this, arguments);
}
const util = require('util'); // Built-in Node package
util.inherits(PgTypes.SOMETYPE, DataTypes.SOMETYPE);

// Mandatory: create, override or reassign a postgres-specific parser
// PgTypes.SOMETYPE.parse = value => value;
PgTypes.SOMETYPE.parse = DataTypes.SOMETYPE.parse || x => x;

// Optional: add or override methods of the postgres-specific datatype
// like toSql, escape, validate, _stringify, _sanitize...

}

範圍

postgres 中定義新的範圍類型後,將其新增到 Sequelize 中非常簡單。

在本範例中,postgres 範圍類型的名稱為 SOMETYPE_range,而基礎 postgres 資料類型的名稱為 pg_new_typesubtypescastTypes 的鍵是 Sequelize 資料類型 DataTypes.SOMETYPE.key 的鍵,以小寫字母表示。

function createTheNewDataType() {
// [...]

// Add postgresql range, SOMETYPE comes from DataType.SOMETYPE.key in lower case
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)