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

其他資料類型

除了模型基礎指南中提到最常見的資料類型外,Sequelize 還提供了其他幾種資料類型。

範圍 (僅限 PostgreSQL)

DataTypes.RANGE(DataTypes.INTEGER); // int4range
DataTypes.RANGE(DataTypes.BIGINT); // int8range
DataTypes.RANGE(DataTypes.DATE); // tstzrange
DataTypes.RANGE(DataTypes.DATEONLY); // daterange
DataTypes.RANGE(DataTypes.DECIMAL); // numrange

由於範圍類型對於其邊界包含/排除具有額外資訊,因此僅使用元組在 javascript 中表示它們並不是很直接。

當以值形式提供範圍時,您可以從以下 API 中選擇

// defaults to inclusive lower bound, exclusive upper bound
const range = [new Date(Date.UTC(2016, 0, 1)), new Date(Date.UTC(2016, 1, 1))];
// '["2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'

// control inclusion
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
{ value: new Date(Date.UTC(2016, 1, 1)), inclusive: true },
];
// '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]'

// composite form
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
new Date(Date.UTC(2016, 1, 1)),
];
// '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'

const Timeline = sequelize.define('Timeline', {
range: DataTypes.RANGE(DataTypes.DATE),
});

await Timeline.create({ range });

但是,檢索到的範圍值始終以物件陣列的形式出現。 例如,如果存儲的值是("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"],在尋找器查詢之後,您將得到

[
{ value: Date, inclusive: false },
{ value: Date, inclusive: true },
];

在使用範圍類型更新實例後,您需要呼叫reload()或使用returning: true選項。

特殊情況

// empty range:
Timeline.create({ range: [] }); // range = 'empty'

// Unbounded range:
Timeline.create({ range: [null, null] }); // range = '[,)'
// range = '[,"2016-01-01 00:00:00+00:00")'
Timeline.create({ range: [null, new Date(Date.UTC(2016, 0, 1))] });

// Infinite range:
// range = '[-infinity,"2016-01-01 00:00:00+00:00")'
Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });

網路位址

Sequelize 資料類型PostgreSQLMariaDBMySQLMSSQLSQLiteSnowflakedb2ibmiOracle 資料庫
CIDRCIDR
INETINET
MACADDRMACADDR

陣列 (僅限 PostgreSQL)

// Defines an array of DataTypes.SOMETHING.
DataTypes.ARRAY(/* DataTypes.SOMETHING */);

// For example
// VARCHAR(255)[]
DataTypes.ARRAY(DataTypes.STRING);
// VARCHAR(255)[][]
DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.STRING));

BLOBs

DataTypes.BLOB; // BLOB (bytea for PostgreSQL)
DataTypes.BLOB('tiny'); // TINYBLOB (bytea for PostgreSQL)
DataTypes.BLOB('medium'); // MEDIUMBLOB (bytea for PostgreSQL)
DataTypes.BLOB('long'); // LONGBLOB (bytea for PostgreSQL)

blob 資料類型允許您將資料插入為字串和緩衝區。 但是,當使用 Sequelize 從資料庫檢索 blob 時,它始終會以緩衝區的形式檢索。

ENUMs

ENUM 是一種資料類型,它只接受幾個值,這些值指定為一個列表。

DataTypes.ENUM('foo', 'bar'); // An ENUM with allowed values 'foo' and 'bar'

ENUM 也可以使用欄位定義的 values 欄位來指定,如下所示

sequelize.define('foo', {
states: {
type: DataTypes.ENUM,
values: ['active', 'pending', 'deleted'],
},
});

JSON (僅限 SQLite、MySQL、MariaDB、Oracle 和 PostgreSQL)

DataTypes.JSON 資料類型僅支援 SQLite、MySQL、MariaDB、Oracle 和 PostgreSQL。 但是,MSSQL 有最低限度的支援 (見下文)。

PostgreSQL 注意事項

PostgreSQL 中的 JSON 資料類型將值儲存為純文字,而不是二進位表示。 如果您只想儲存和檢索 JSON 表示,使用 JSON 會佔用較少的磁碟空間,並且從其輸入表示建置所需的時間也較少。 但是,如果您想對 JSON 值執行任何操作,您應該偏好下面描述的 JSONB 資料類型。

JSONB (僅限 PostgreSQL)

PostgreSQL 也支援 JSONB 資料類型:DataTypes.JSONB。 可以透過三種不同的方式查詢它

// Nested object
await Foo.findOne({
where: {
meta: {
video: {
url: {
[Op.ne]: null,
},
},
},
},
});

// Nested key
await Foo.findOne({
where: {
'meta.audio.length': {
[Op.gt]: 20,
},
},
});

// Containment
await Foo.findOne({
where: {
meta: {
[Op.contains]: {
site: {
url: 'https://google.com',
},
},
},
},
});

MSSQL

MSSQL 沒有 JSON 資料類型,但自 SQL Server 2016 以來,它確實透過某些函數提供對儲存為字串的 JSON 的一些支援。 使用這些函數,您將能夠查詢儲存在字串中的 JSON,但任何傳回的值都需要單獨解析。

// ISJSON - to test if a string contains valid JSON
await User.findAll({
where: sequelize.where(sequelize.fn('ISJSON', sequelize.col('userDetails')), 1),
});

// JSON_VALUE - extract a scalar value from a JSON string
await User.findAll({
attributes: [
[sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), 'address line 1'],
],
});

// JSON_VALUE - query a scalar value from a JSON string
await User.findAll({
where: sequelize.where(
sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'),
'14, Foo Street',
),
});

// JSON_QUERY - extract an object or array
await User.findAll({
attributes: [
[sequelize.fn('JSON_QUERY', sequelize.col('userDetails'), '$.address'), 'full address'],
],
});

雜項資料類型

Sequelize 資料類型PostgreSQLMariaDBMySQLMSSQLSQLiteSnowflakedb2ibmiOracle 資料庫
GEOMETRYGEOMETRYGEOMETRYGEOMETRY
GEOMETRY('POINT')GEOMETRY(POINT)POINTPOINT
GEOMETRY('POINT', 4326)GEOMETRY(POINT,4326)
GEOMETRY('POLYGON')GEOMETRY(POLYGON)POLYGONPOLYGON
GEOMETRY('LINESTRING')GEOMETRY(LINESTRING)LINESTRINGLINESTRING
GEOGRAPHYGEOGRAPHY
HSTOREHSTORE
注意

在 Postgres 中,GEOMETRY 和 GEOGRAPHY 類型由 PostGIS 擴充實作。

在 Postgres 中,如果您使用 DataTypes.HSTORE,則必須安裝 pg-hstore 套件