其他数据类型
除了模型基础指南中提到的最常见数据类型外,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))] });
网络地址
数组 (仅限 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 数据类型 | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi | Oracle 数据库 |
---|---|---|---|---|---|---|---|---|---|
GEOMETRY | GEOMETRY | GEOMETRY | GEOMETRY | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT') | GEOMETRY(POINT) | POINT | POINT | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT', 4326) | GEOMETRY(POINT,4326) | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POLYGON') | GEOMETRY(POLYGON) | POLYGON | POLYGON | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('LINESTRING') | GEOMETRY(LINESTRING) | LINESTRING | LINESTRING | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOGRAPHY | GEOGRAPHY | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
HSTORE | HSTORE | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
在 Postgres 中,GEOMETRY 和 GEOGRAPHY 类型由 PostGIS 扩展 实现。
在 Postgres 中,如果您使用 DataTypes.HSTORE
,则必须安装 pg-hstore 包