NodeJS的sequelize小知识2

425 阅读3分钟

这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

其他数据类型

范围 (仅限 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

由于范围类型对于它们绑定的 包含/排除 具有额外的信息

// 默认为包含下限,排除上限
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']
  }
});
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

MSSQL

MSSQL 没有 JSON 数据类型,但能够查询存储在字符串中的 JSON