教程 > sequelize 中文教程 > 阅读:20

sequelize 其他数据类型——迹忆客-ag捕鱼王app官网

除了模型基础 文章中提到的最常见的数据类型外,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 中进行选择:

// 默认为包含下限,排除上限
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")'
// 控制包含
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"]'
// 复合形式
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 });

然而,检索到的范围值始终以对象数组的形式出现。 例如,如果在 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: [] }); // range = 'empty'
// 无界范围:
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))] });
// 无限范围:
// range = '[-infinity,"2016-01-01 00:00:00 00:00")'
timeline.create({ range: [-infinity, new date(date.utc(2016, 0, 1))] });

blob

datatypes.blob                // blob (postgresql 的 bytea)
datatypes.blob('tiny')        // tinyblob (postgresql 的 bytea)
datatypes.blob('medium')      // mediumblob (postgresql 的 bytea)
datatypes.blob('long')        // longblob (postgresql 的 bytea)

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


enum

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

datatypes.enum('foo', 'bar') // 允许值为'foo'和'bar'的enum

也可以使用列定义的 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,但是所有返回的值将需要单独解析。

// isjson - 测试字符串是否包含有效的 json
await user.findall({
  where: sequelize.where(sequelize.fn('isjson', sequelize.col('userdetails')), 1)
})
// json_value - 从 json 字符串中提取标量值
await user.findall({
  attributes: [[ sequelize.fn('json_value', sequelize.col('userdetails'), '$.address.line1'), 'address line 1']]
})
// json_value - 从 json 字符串查询标量值
await user.findall({
  where: sequelize.where(sequelize.fn('json_value', sequelize.col('userdetails'), '$.address.line1'), '14, foo street')
})
// json_query - 提取对象或数组
await user.findall({
  attributes: [[ sequelize.fn('json_query', sequelize.col('userdetails'), '$.address'), 'full address']]
})

其他

datatypes.array(/* datatypes.something */)  // 定义一个 datatypes.something 数组. 仅限 postgresql.
datatypes.cidr                        // cidr                  仅限 postgresql
datatypes.inet                        // inet                  仅限 postgresql
datatypes.macaddr                     // macaddr               仅限 postgresql
datatypes.geometry                    // 空间列. 仅限 postgresql (使用 postgis) 或 mysql.
datatypes.geometry('point')           // 具有几何类型的空间列.仅限 postgresql (使用 postgis) 或 mysql.
datatypes.geometry('point', 4326)     // 具有几何类型和 srid 的空间列.仅限 postgresql (使用 postgis) 或 mysql.

查看笔记

扫码一下
查看教程更方便
网站地图