数据库类型
About 8 min
数据类型
在模型中定义的每一列都必须具有数据类型。 Sequelize
提供很多内置数据类型。
要访问内置数据类型,必须导入 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数据库
在 MySQL
和 MariaDB
中,可以将数据类型INTEGER
、 BIGINT
、 FLOAT
和 DOUBLE
设置为无符号或零填充(或两者),如下所示:
DataTypes.INTEGER.UNSIGNED
DataTypes.INTEGER.ZEROFILL
DataTypes.INTEGER.UNSIGNED.ZEROFILL
- 可以指定大小,即:
INTEGER(10)
而不是简单的INTEGER
- 同样适用于
BIGINT
、FLOAT
和DOUBLE
日期
// DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE
// DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATE(6)
// 不带时间的 DATE
DataTypes.DATEONLY
UUID
可以通过 DataTypes.UUID
使用UUID
,生成随机字符串
- 对于
PostgreSQL
和SQLite
,它会是UUID
数据类型 - 对于
MySQL
,它则变成CHAR(36)
使用 Sequelize.UUIDV1
或 Sequelize.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类型
SQLite
、MySQL
、MariaDB
、Oracle
和 PostgreSQL
数据库都一定程度上支持JSON
数据类型,例如:
PostgreSQL
中的 JSON
数据类型将值存储为纯文本,而不是二进制表示形式。
- 如果只想存储和检索
JSON
表示形式,那么使用JSON
将占用更少的磁盘空间和从其输入表示形式构建的时间。 - 如果想对
JSON
值执行任何操作,可以是使用JSONB
类型。
PostgreSQL
还支持 JSONB
数据类型,具体使用可以参考:Sequelize中JSONB的查询