除了模型基础指南中提到的最常见的数据类型外,Sequelize 还提供了其他几种数据类型.
范围 (仅限 PostgreSQL)#
DataTypes.RANGE(DataTypes.INTEGER)
DataTypes.RANGE(DataTypes.BIGINT)
DataTypes.RANGE(DataTypes.DATE)
DataTypes.RANGE(DataTypes.DATEONLY)
DataTypes.RANGE(DataTypes.DECIMAL)
由于范围类型对于它们绑定的 包含/排除 具有额外的信息,因此仅使用元组在 javascript 中表示它们并不是很容易.
当提供范围值时,可以从以下 API 中进行选择:
const range = [
new Date(Date.UTC(2016, 0, 1)),
new Date(Date.UTC(2016, 1, 1))
];
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
{ value: new Date(Date.UTC(2016, 1, 1)), inclusive: true },
];
const range = [
{ value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
new Date(Date.UTC(2016, 1, 1)),
];
const Timeline = sequelize.define('Timeline', {
range: DataTypes.RANGE(DataTypes.DATE)
});
await Timeline.create({ range });
然而,检索到的范围值始终以对象数组的形式出现. 例如,如果在 finder 查询后,存储的值是 ("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
参数.
特别案例#
Timeline.create({ range: [] });
Timeline.create({ range: [null, null] });
Timeline.create({ range: [null, new Date(Date.UTC(2016, 0, 1))] });
Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });
BLOB#
DataTypes.BLOB
DataTypes.BLOB('tiny')
DataTypes.BLOB('medium')
DataTypes.BLOB('long')
Blob 数据类型允许你将数据既作为字符串又作为缓冲区插入. 但是,当使用 Sequelize从 数据库中检索 Blob 时,将始终将其作为缓冲区检索.
ENUM#
ENUM 是仅接受几个值(指定为列表)的数据类型.
DataTypes.ENUM('foo', 'bar')
也可以使用列定义的 values
字段指定 ENUM,如下所示:
sequelize.define('foo', {
states: {
type: DataTypes.ENUM,
values: ['active', 'pending', 'deleted']
}
});
JSON (仅限 SQLite, MySQL, MariaDB 和 PostgreSQL)#
仅 SQLite,MySQL,MariaDB 和 PostgreSQL 支持 DataTypes.JSON
数据类型. 但是,对 MSSQL 的支持最少(请参见下文).
PostgreSQL 的注意事项#
PostgreSQL 中的 JSON 数据类型将值存储为纯文本,而不是二进制表示. 如果只想存储和检索 JSON 表示形式,则使用 JSON 将占用更少的磁盘空间,并需要更少的时间从其输入表示形式进行构建. 但是,如果要对 JSON 值执行任何操作,则应首选以下所述的 JSONB 数据类型.
JSONB (仅限 PostgreSQL)#
PostgreSQL 还支持 JSONB 数据类型: DataTypes.JSONB
. 可以通过三种不同的方式查询它:
await Foo.findOne({
where: {
meta: {
video: {
url: {
[Op.ne]: null
}
}
}
}
});
await Foo.findOne({
where: {
"meta.audio.length": {
[Op.gt]: 20
}
}
});
await Foo.findOne({
where: {
meta: {
[Op.contains]: {
site: {
url: 'http://google.com'
}
}
}
}
});
MSSQL#
MSSQL 没有 JSON 数据类型,但是自 SQL Server 2016 起,它确实通过某些函数提供了对以字符串形式存储的 JSON 的支持.使用这些函数,你将能够查询存储在字符串中的 JSON,但是所有返回的值将需要单独解析.
await User.findAll({
where: sequelize.where(sequelize.fn('ISJSON', sequelize.col('userDetails')), 1)
})
await User.findAll({
attributes: [[ sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), 'address line 1']]
})
await User.findAll({
where: sequelize.where(sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), '14, Foo Street')
})
await User.findAll({
attributes: [[ sequelize.fn('JSON_QUERY', sequelize.col('userDetails'), '$.address'), 'full address']]
})
DataTypes.ARRAY()
DataTypes.CIDR
DataTypes.INET
DataTypes.MACADDR
DataTypes.GEOMETRY
DataTypes.GEOMETRY('POINT')
DataTypes.GEOMETRY('POINT', 4326)