Other Data Types - 其他数据类型

除了模型基础指南中提到的最常见的数据类型外,Sequelize 还提供了其他几种数据类型.

范围 (仅限 PostgreSQL)

  1. DataTypes.RANGE(DataTypes.INTEGER) // int4range
  2. DataTypes.RANGE(DataTypes.BIGINT) // int8range
  3. DataTypes.RANGE(DataTypes.DATE) // tstzrange
  4. DataTypes.RANGE(DataTypes.DATEONLY) // daterange
  5. DataTypes.RANGE(DataTypes.DECIMAL) // numrange

由于范围类型对于它们绑定的 包含/排除 具有额外的信息,因此仅使用元组在 javascript 中表示它们并不是很容易.

当提供范围值时,可以从以下 API 中进行选择:

  1. // 默认为包含下限,排除上限
  2. const range = [
  3. new Date(Date.UTC(2016, 0, 1)),
  4. new Date(Date.UTC(2016, 1, 1))
  5. ];
  6. // '["2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
  7. // 控制包含
  8. const range = [
  9. { value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
  10. { value: new Date(Date.UTC(2016, 1, 1)), inclusive: true },
  11. ];
  12. // '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]'
  13. // 复合形式
  14. const range = [
  15. { value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
  16. new Date(Date.UTC(2016, 1, 1)),
  17. ];
  18. // '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
  19. const Timeline = sequelize.define('Timeline', {
  20. range: DataTypes.RANGE(DataTypes.DATE)
  21. });
  22. await Timeline.create({ range });

然而,检索到的范围值始终以对象数组的形式出现. 例如,如果在 finder 查询后,存储的值是 ("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"] 你会得到:

  1. [
  2. { value: Date, inclusive: false },
  3. { value: Date, inclusive: true }
  4. ]

使用范围类型更新实例后,你需要调用 reload() 或使用 returning: true 参数.

特别案例

  1. // 空范围:
  2. Timeline.create({ range: [] }); // range = 'empty'
  3. // 无界范围:
  4. Timeline.create({ range: [null, null] }); // range = '[,)'
  5. // range = '[,"2016-01-01 00:00:00+00:00")'
  6. Timeline.create({ range: [null, new Date(Date.UTC(2016, 0, 1))] });
  7. // 无限范围:
  8. // range = '[-infinity,"2016-01-01 00:00:00+00:00")'
  9. Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });

BLOB

  1. DataTypes.BLOB // BLOB (PostgreSQL 的 bytea)
  2. DataTypes.BLOB('tiny') // TINYBLOB (PostgreSQL 的 bytea)
  3. DataTypes.BLOB('medium') // MEDIUMBLOB (PostgreSQL 的 bytea)
  4. DataTypes.BLOB('long') // LONGBLOB (PostgreSQL 的 bytea)

Blob 数据类型允许你将数据既作为字符串又作为缓冲区插入. 但是,当使用 Sequelize从 数据库中检索 Blob 时,将始终将其作为缓冲区检索.

ENUM

ENUM 是仅接受几个值(指定为列表)的数据类型.

  1. DataTypes.ENUM('foo', 'bar') // 允许值为'foo'和'bar'的ENUM

也可以使用列定义的 values 字段指定 ENUM,如下所示:

  1. sequelize.define('foo', {
  2. states: {
  3. type: DataTypes.ENUM,
  4. values: ['active', 'pending', 'deleted']
  5. }
  6. });

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. 可以通过三种不同的方式查询它:

  1. // 嵌套对象
  2. await Foo.findOne({
  3. where: {
  4. meta: {
  5. video: {
  6. url: {
  7. [Op.ne]: null
  8. }
  9. }
  10. }
  11. }
  12. });
  13. // 嵌套键
  14. await Foo.findOne({
  15. where: {
  16. "meta.audio.length": {
  17. [Op.gt]: 20
  18. }
  19. }
  20. });
  21. // 包含限制
  22. await Foo.findOne({
  23. where: {
  24. meta: {
  25. [Op.contains]: {
  26. site: {
  27. url: 'http://google.com'
  28. }
  29. }
  30. }
  31. }
  32. });

MSSQL

MSSQL 没有 JSON 数据类型,但是自 SQL Server 2016 起,它确实通过某些函数提供了对以字符串形式存储的 JSON 的支持.使用这些函数,你将能够查询存储在字符串中的 JSON,但是所有返回的值将需要单独解析.

  1. // ISJSON - 测试字符串是否包含有效的 JSON
  2. await User.findAll({
  3. where: sequelize.where(sequelize.fn('ISJSON', sequelize.col('userDetails')), 1)
  4. })
  5. // JSON_VALUE - 从 JSON 字符串中提取标量值
  6. await User.findAll({
  7. attributes: [[ sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), 'address line 1']]
  8. })
  9. // JSON_VALUE - 从 JSON 字符串查询标量值
  10. await User.findAll({
  11. where: sequelize.where(sequelize.fn('JSON_VALUE', sequelize.col('userDetails'), '$.address.Line1'), '14, Foo Street')
  12. })
  13. // JSON_QUERY - 提取对象或数组
  14. await User.findAll({
  15. attributes: [[ sequelize.fn('JSON_QUERY', sequelize.col('userDetails'), '$.address'), 'full address']]
  16. })

其他

  1. DataTypes.ARRAY(/* DataTypes.SOMETHING */) // 定义一个 DataTypes.SOMETHING 数组. 仅限 PostgreSQL.
  2. DataTypes.CIDR // CIDR 仅限 PostgreSQL
  3. DataTypes.INET // INET 仅限 PostgreSQL
  4. DataTypes.MACADDR // MACADDR 仅限 PostgreSQL
  5. DataTypes.GEOMETRY // 空间列. 仅限 PostgreSQL (使用 PostGIS) 或 MySQL.
  6. DataTypes.GEOMETRY('POINT') // 具有几何类型的空间列.仅限 PostgreSQL (使用 PostGIS) 或 MySQL.
  7. DataTypes.GEOMETRY('POINT', 4326) // 具有几何类型和 SRID 的空间列.仅限 PostgreSQL (使用 PostGIS) 或 MySQL.