跳至主要内容
版本: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));

BLOB

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 时,它始终以缓冲区形式检索。

ENUM

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