跳至主要內容

数据库类型

微信公众号:储凡About 8 min

数据类型

在模型中定义的每一列都必须具有数据类型。 Sequelize 提供很多内置数据类型open in new window

要访问内置数据类型,必须导入 DataTypes

// 引入模块,解构出 DataTypes
const {DataTypes} = require("sequelize");

基础类型

字符串

DataTypes.STRING             // VARCHAR(255)
DataTypes.STRING(1234)       // VARCHAR(1234)
DataTypes.STRING.BINARY      // VARCHAR BINARY
DataTypes.TEXT               // TEXT
DataTypes.TEXT('tiny')       // TINYTEXT

// 仅支持 PostgreSQL 和 SQLite.
DataTypes.CITEXT             // CITEXT          

布尔

DataTypes.BOOLEAN            // TINYINT(1)

数字

DataTypes.INTEGER            // INTEGER
DataTypes.BIGINT             // BIGINT
DataTypes.BIGINT(11)         // BIGINT(11)

DataTypes.FLOAT              // FLOAT
DataTypes.FLOAT(11)          // FLOAT(11)
DataTypes.FLOAT(11, 10)      // FLOAT(11,10)

DataTypes.REAL               // REAL            仅支持 PostgreSQL.
DataTypes.REAL(11)           // REAL(11)        仅支持 PostgreSQL.
DataTypes.REAL(11, 12)       // REAL(11,12)     仅支持 PostgreSQL.

DataTypes.DOUBLE             // DOUBLE
DataTypes.DOUBLE(11)         // DOUBLE(11)
DataTypes.DOUBLE(11, 10)     // DOUBLE(11,10)

DataTypes.DECIMAL            // DECIMAL
DataTypes.DECIMAL(10, 2)     // DECIMAL(10,2)

无符号和零填充整数

仅支持MySQL、MariaDB数据库

MySQLMariaDB 中,可以将数据类型INTEGERBIGINTFLOATDOUBLE 设置为无符号或零填充(或两者),如下所示:

DataTypes.INTEGER.UNSIGNED
DataTypes.INTEGER.ZEROFILL
DataTypes.INTEGER.UNSIGNED.ZEROFILL
  • 可以指定大小,即:INTEGER(10)而不是简单的INTEGER
  • 同样适用于 BIGINTFLOATDOUBLE

日期

// DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE

// DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATE(6)

// 不带时间的 DATE
DataTypes.DATEONLY   

UUID

可以通过 DataTypes.UUID使用UUID,生成随机字符串

  • 对于 PostgreSQLSQLite,它会是 UUID 数据类型
  • 对于 MySQL ,它则变成CHAR(36)

使用 Sequelize.UUIDV1Sequelize.UUIDV4作为默认值,可以自动为这些字段生成 UUID值,例如:

{
  type: DataTypes.UUID
  // 或者默认值使用 Sequelize.UUIDV1
  defaultValue:  Sequelize.UUIDV4
}

其他类型

不同的数据库,存在一些特有的数据类型,这里按照不同数据库进行整理。

范围类型

只针对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

数组类型

只针对PostgreSQL数据库,支持数组类型

// 定义数组类型
DataTypes.ARRAY(/* DataTypes.SOMETHING */)

// VARCHAR(255)[]
DataTypes.ARRAY(DataTypes.STRING)

// VARCHAR(255)[][]
DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.STRING))

二进制类型

只针对PostgreSQL数据库,支持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 是一种仅接受少数值的数据类型,指定为列表,提供可选值供选择。例如:

DataTypes.ENUM('foo', 'bar') // An ENUM with allowed values 'foo' and 'bar'

可以使用values字段来指明ENUM可选值

// 使用values字段来维护枚举
sequelize.define('user', {
  states: {
    type: DataTypes.ENUM,
    values: ['create', 'update', 'delete']
  }
});

JSON类型

SQLiteMySQLMariaDBOraclePostgreSQL数据库都一定程度上支持JSON数据类型,例如:

PostgreSQL 中的 JSON 数据类型将值存储为纯文本,而不是二进制表示形式。

  • 如果只想存储和检索 JSON 表示形式,那么使用 JSON 将占用更少的磁盘空间和从其输入表示形式构建的时间。
  • 如果想对 JSON 值执行任何操作,可以是使用JSONB类型。

PostgreSQL 还支持 JSONB 数据类型,具体使用可以参考:Sequelize中JSONB的查询open in new window