Sequelize 提供了很多内置数据类型. 要访问内置数据类型, 你必须导入 DataTypes
:
// 导入内置数据类型
import { DataTypes } from '@sequelize/core';
下面是一系列支持表, 描述了每种 Sequelize 数据类型使用哪种 SQL 类型.
注意
我们的大多数数据类型也接受参数包. 点击下表中的一种数据类型以查看其签名.
❌ 表示方言不支持该数据类型.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
STRING |
VARCHAR(255) |
VARCHAR(255) |
VARCHAR(255) |
NVARCHAR(255) |
TEXT |
VARCHAR(255) |
VARCHAR(255) |
VARCHAR(255) |
STRING(100) |
VARCHAR(100) |
VARCHAR(100) |
VARCHAR(100) |
NVARCHAR(100) |
TEXT |
VARCHAR(100) |
VARCHAR(100) |
VARCHAR(100) |
STRING.BINARY |
❌ | VARCHAR(255) BINARY |
VARCHAR(255) BINARY |
❌ | TEXT COLLATE BINARY |
VARCHAR(255) BINARY |
VARCHAR(255) FOR BIT DATA |
VARCHAR(255) FOR BIT DATA |
STRING(100).BINARY |
❌ | VARCHAR(100) BINARY |
VARCHAR(100) BINARY |
❌ | TEXT COLLATE BINARY |
VARCHAR(100) BINARY |
VARCHAR(100) FOR BIT DATA |
VARCHAR(100) FOR BIT DATA |
TEXT |
TEXT |
TEXT |
TEXT |
NVARCHAR(MAX) |
TEXT |
TEXT |
CLOB(2147483647) |
CLOB(2147483647) |
TEXT('tiny') |
TEXT |
TINYTEXT |
TINYTEXT |
NVARCHAR(256) |
TEXT |
TEXT |
VARCHAR(256) |
VARCHAR(256) |
TEXT('medium') |
TEXT |
MEDIUMTEXT |
MEDIUMTEXT |
NVARCHAR(MAX) |
TEXT |
TEXT |
VARCHAR(16777216) |
VARCHAR(16777216) |
TEXT('long') |
TEXT |
LONGTEXT |
LONGTEXT |
NVARCHAR(MAX) |
TEXT |
TEXT |
CLOB(2147483647) |
CLOB(2147483647) |
CHAR |
CHAR(255) |
CHAR(255) |
CHAR(255) |
CHAR(255) |
❌ | CHAR(255) |
CHAR(255) |
CHAR(255) |
CHAR(100) |
CHAR(100) |
CHAR(100) |
CHAR(100) |
CHAR(100) |
❌ | CHAR(100) |
CHAR(100) |
CHAR(100) |
CHAR.BINARY |
❌ | CHAR(255) BINARY |
CHAR(255) BINARY |
❌ | ❌ | CHAR(255) BINARY |
CHAR(255) FOR BIT DATA |
CHAR(255) FOR BIT DATA |
CHAR(100).BINARY |
❌ | CHAR(100) BINARY |
CHAR(100) BINARY |
❌ | ❌ | CHAR(100) BINARY |
CHAR(255) FOR BIT DATA |
CHAR(255) FOR BIT DATA |
CITEXT |
CITEXT |
❌ | ❌ | ❌ | TEXT COLLATE NOCASE |
❌ | ❌ | ❌ |
TSVECTOR |
TSVECTOR |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
BOOLEAN |
BOOLEAN |
TINYINT(1) |
TINYINT(1) |
BIT |
TINYINT(1) |
BOOLEAN |
BOOLEAN |
SMALLINT |
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
TINYINT |
SMALLINT 1 |
TINYINT |
TINYINT |
SMALLINT 2 |
INTEGER |
INTEGER |
SMALLINT 1 |
SMALLINT 1 |
TINYINT(1) |
❌ | TINYINT(1) |
TINYINT(1) |
❌ | ❌ | `❌ | ❌ | ❌ |
TINYINT.UNSIGNED |
SMALLINT |
TINYINT UNSIGNED |
TINYINT UNSIGNED |
TINYINT 2 |
INTEGER |
INTEGER |
SMALLINT |
SMALLINT |
TINYINT.ZEROFILL |
❌ | TINYINT ZEROFILL |
TINYINT ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
SMALLINT |
SMALLINT |
SMALLINT |
SMALLINT |
SMALLINT |
INTEGER |
INTEGER |
SMALLINT |
SMALLINT |
SMALLINT(1) |
❌ | SMALLINT(1) |
SMALLINT(1) |
❌ | ❌ | ❌ | ❌ | ❌ |
SMALLINT.UNSIGNED |
INTEGER 3 |
SMALLINT UNSIGNED |
SMALLINT UNSIGNED |
INTEGER 3 |
INTEGER |
INTEGER |
INTEGER 3 |
INTEGER 3 |
SMALLINT.ZEROFILL |
❌ | SMALLINT ZEROFILL |
SMALLINT ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
MEDIUMINT |
INTEGER |
MEDIUMINT |
MEDIUMINT |
INTEGER 1 |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
MEDIUMINT(1) |
❌ | MEDIUMINT(1) |
MEDIUMINT(1) |
❌ | ❌ | ❌ | ❌ | ❌ |
MEDIUMINT.UNSIGNED |
INTEGER |
MEDIUMINT UNSIGNED |
MEDIUMINT UNSIGNED |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
MEDIUMINT.ZEROFILL |
❌ | MEDIUMINT ZEROFILL |
MEDIUMINT ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER |
INTEGER(1) |
❌ | INTEGER(1) |
INTEGER(1) |
❌ | ❌ | ❌ | ❌ | ❌ |
INTEGER.UNSIGNED |
BIGINT |
INTEGER UNSIGNED |
INTEGER UNSIGNED |
BIGINT |
INTEGER |
INTEGER |
BIGINT |
BIGINT |
INTEGER.ZEROFILL |
❌ | INTEGER ZEROFILL |
INTEGER ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
BIGINT |
INTEGER |
INTEGER |
BIGINT |
BIGINT |
BIGINT(1) |
❌ | BIGINT(1) |
BIGINT(1) |
❌ | ❌ | ❌ | ❌ | ❌ |
BIGINT.UNSIGNED |
❌ | BIGINT UNSIGNED |
BIGINT UNSIGNED |
❌ | INTEGER |
INTEGER |
❌ | ❌ |
BIGINT.ZEROFILL |
❌ | BIGINT ZEROFILL |
BIGINT ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
注意
JavaScript number
类型可以表示范围从 -9007199254740991
到 9007199254740991
.
如果你的 SQL 类型支持超出此范围的整数值, 我们建议使用 bigint
或 string
来表示你的整数.
可以组合数字参数:
DataTypes.INTEGER(1).UNSIGNED.ZEROFILL
将在 MySQL 中生成类型为 INTEGER(1) UNSIGNED ZEROFILL
的列.
下表中的类型通常表示为 IEEE 754 浮点数, 如 JavaScript number
类型.
FLOAT
是一种单精度浮点类型.DOUBLE
是双精度浮点类型.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
FLOAT |
REAL |
FLOAT |
FLOAT |
REAL |
REAL 4 |
FLOAT 5 |
REAL |
REAL |
FLOAT(11, 10) |
❌ | FLOAT(11,10) |
FLOAT(11,10) |
❌ | ❌ | ❌ | ❌ | ❌ |
FLOAT.UNSIGNED |
REAL |
FLOAT UNSIGNED |
FLOAT UNSIGNED |
REAL |
REAL |
FLOAT |
REAL |
REAL |
FLOAT.ZEROFILL |
❌ | FLOAT ZEROFILL |
FLOAT ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
DOUBLE |
DOUBLE PRECISION |
DOUBLE PRECISION |
DOUBLE PRECISION |
DOUBLE PRECISION |
REAL |
FLOAT |
DOUBLE |
DOUBLE |
DOUBLE(11, 10) |
❌ | DOUBLE PRECISION(11, 10) |
DOUBLE PRECISION(11, 10) |
❌ | ❌ | ❌ | ❌ | ❌ |
DOUBLE.UNSIGNED |
DOUBLE PRECISION |
DOUBLE PRECISION UNSIGNED |
DOUBLE PRECISION UNSIGNED |
DOUBLE PRECISION |
REAL |
FLOAT |
DOUBLE |
DOUBLE |
DOUBLE.ZEROFILL |
❌ | DOUBLE PRECISION ZEROFILL |
DOUBLE PRECISION ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
注意
可以组合数字参数:
DataTypes.FLOAT(1, 2).UNSIGNED.ZEROFILL
将在 MySQL 中生成类型为 FLOAT(1, 2) UNSIGNED ZEROFILL
的列.
DECIMAL
是一种不受约束的十进制类型.DECIMAL(precision, scale)
是一种受约束的小数类型.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
DECIMAL |
DECIMAL |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
DECIMAL(11, 10) |
DECIMAL(11, 10) |
DECIMAL(11,10) |
DECIMAL(11,10) |
DECIMAL(11,10) |
❌ | DECIMAL(11,10) |
DECIMAL(11,10) |
DECIMAL(11,10) |
DECIMAL(p, s).UNSIGNED |
DECIMAL(p, s) |
DECIMAL(p, s) UNSIGNED |
DECIMAL(p, s) UNSIGNED |
DECIMAL(p, s) |
❌ | DECIMAL(p, s) |
DECIMAL(p, s) |
DECIMAL(p, s) |
DECIMAL(p, s).ZEROFILL |
❌ | DECIMAL(p, s) ZEROFILL |
DECIMAL(p, s) ZEROFILL |
❌ | ❌ | ❌ | ❌ | ❌ |
注意
精确的十进制数在 JavaScript 中还无法表示.
JavaScript number
类型是双精度 64 位二进制格式 IEEE 754 值, 更好地表示 [不精确的小数类型].
为避免任何精度损失, 我们建议使用 string
在 JavaScript 中表示精确的小数.
可以组合数字参数:
DataTypes.DECIMAL(1, 2).UNSIGNED.ZEROFILL
将在 MySQL 中生成类型为 DECIMAL(1, 2) UNSIGNED ZEROFILL
的列.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
DATE |
TIMESTAMP WITH TIME ZONE |
DATETIME |
DATETIME |
DATETIMEOFFSET |
TEXT |
TIMESTAMP |
TIMESTAMP |
TIMESTAMP |
DATE(6) |
TIMESTAMP(6) WITH TIME ZONE |
DATETIME(6) |
DATETIME(6) |
DATETIMEOFFSET(6) |
TEXT |
TIMESTAMP(6) |
TIMESTAMP(6) |
TIMESTAMP(6) |
DATEONLY |
DATE |
DATE |
DATE |
DATE |
TEXT |
DATE |
DATE |
DATE |
TIME |
TIME |
TIME |
TIME |
TIME |
TEXT |
TIME |
TIME |
TIME |
TIME(6) |
TIME(6) |
TIME(6) |
TIME(6) |
TIME(6) |
TEXT |
TIME(6) |
TIME(6) |
TIME(6) |
除了常规 默认值, Sequelize 还提供了 DataTypes.NOW
它将根据你的方言使用适当的原生 SQL 函数.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
NOW |
NOW |
NOW |
NOW |
GETDATE() |
❌ | NOW |
CURRENT TIME |
NOW |
MyModel.init({
myDate: {
type: DataTypes.DATE,
defaultValue: DataTypes.NOW,
},
});
对于 UUIDs, use DataTypes.UUID
. 它将成为 PostgreSQL 和 SQLite 的 UUID
数据类型, 以及 MySQL 的 CHAR(36)
.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
UUID |
UUID |
CHAR(36) BINARY |
CHAR(36) BINARY |
UNIQUEIDENTIFIER |
TEXT |
VARCHAR(36) |
CHAR(36) FOR BIT DATA |
CHAR(36) FOR BIT DATA |
Sequelize 可以为这些字段自动生成 UUID, 只需使用 DataTypes.UUIDV1
或 DataTypes.UUIDV4
作为默认值:
MyModel.init({
myUuid: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4, // Or DataTypes.UUIDV1
},
});
注意
DataTypes.UUIDV1
和 DataTypes.UUIDV4
的值的生成由 JavaScript 中的 Sequelize 层完成.
因此, 它仅在与模型交互时使用. 它不能用于 migrations.
如果你的方言提供了一个内置的 SQL 函数来生成 UUID, 你可以使用 fn
在 SQL 层上设置一个默认值.
使其可用于原始查询和迁移.
import { fn } from '@sequelize/core';
MyModel.init({
myUuid: {
type: DataTypes.UUID,
// 'uuid_generate_v4' 仅在 postgres + uuid-ossp 可用
// 其他方言可能以不同的名称支持此功能.
defaultValue: fn('uuid_generate_v4'),
},
});
:::
blob 数据类型允许你以字符串和缓冲区的形式插入数据. 但是, 当使用 Sequelize 从数据库中检索 blob 时, 它将始终作为 Node Buffer 检索.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
BLOB |
BYTEA |
BLOB |
BLOB |
VARBINARY(MAX) |
BLOB |
BLOB |
BLOB(1M) |
BLOB(1M) |
BLOB('tiny') |
BYTEA |
TINYBLOB |
TINYBLOB |
VARBINARY(256) |
BLOB |
TINYBLOB |
BLOB(255) |
BLOB(255) |
BLOB('medium') |
BYTEA |
MEDIUMBLOB |
MEDIUMBLOB |
VARBINARY(MAX) |
BLOB |
MEDIUMBLOB |
BLOB(16M) |
BLOB(16M) |
BLOB('long') |
BYTEA |
LONGBLOB |
LONGBLOB |
VARBINARY(MAX) |
BLOB |
LONGBLOB |
BLOB(2G) |
BLOB(2G) |
注意
Enums 仅在 PostgreSQL, MariaDB, 和 MySQL 中可用.
ENUM 是一种只接受少数值的数据类型, 指定为列表.
DataTypes.ENUM('foo', 'bar') // 具有允许值 'foo' 和 'bar' 的 ENUM
有关此 DataType 接受的参数的更多信息, 请参阅 DataTypes.ENUM 的 API 参考.
DataTypes.JSON
数据类型仅支持 SQLite, MySQL, MariaDB 和 PostgreSQL. 但是, 对 MSSQL 有最低限度的支持(见下文).
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
JSON |
JSON |
JSON |
JSON |
NVARCHAR(MAX) |
TEXT |
❌ | ❌ | ❌ |
JSONB |
JSONB |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
PostgreSQL 中的 JSON 数据类型将值存储为纯文本, 而不是二进制表示.
如果你只是想存储和检索 JSON 表示, 使用 JSON 将占用更少的磁盘空间和更少的时间来构建其输入表示. 但是, 如果你想对 JSON 值进行任何操作, 你应该首选 JSONB 数据类型.
查询 JSON
Sequelize 提供了一种特殊的语法来查询 JSON 对象的内容. 阅读有关查询 JSON 的更多信息.
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
GEOMETRY |
GEOMETRY |
GEOMETRY |
GEOMETRY |
❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT') |
GEOMETRY(POINT) |
POINT |
POINT |
❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POINT', 4326) |
GEOMETRY(POINT,4326) |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('POLYGON') |
GEOMETRY(POLYGON) |
POLYGON |
POLYGON |
❌ | ❌ | ❌ | ❌ | ❌ |
GEOMETRY('LINESTRING') |
GEOMETRY(LINESTRING) |
LINESTRING |
LINESTRING |
❌ | ❌ | ❌ | ❌ | ❌ |
GEOGRAPHY |
GEOGRAPHY |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
HSTORE |
HSTORE |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
注意
在 Postgres 中, GEOMETRY 和 GEOGRAPHY 类型由 PostGIS 扩展 实现.
在 Postgres 中, 如果使用 DataTypes.HSTORE
, 则必须安装 pg-hstore 包.
注意
Arrays 仅在 PostgreSQL 中可用.
// 定义 DataTypes.SOMETHING 的数组
DataTypes.ARRAY(/* DataTypes.SOMETHING */)
// VARCHAR(255)[]
DataTypes.ARRAY(DataTypes.STRING)
// VARCHAR(255)[][]
DataTypes.ARRAY(DataTypes.ARRAY(DataTypes.STRING))
注意
Ranges 仅在 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 });
然而, 检索到的范围值总是以对象数组的形式出现. 例如, 如果存储的值为("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]
, 在finder查询之后你会得到:
[
{ value: Date, inclusive: false },
{ value: Date, inclusive: true }
]
你需要在使用范围类型更新实例后调用 reload()
或使用 returning: true
参数.
// 空 range:
Timeline.create({ range: [] }); // range = 'empty'
// 无界限 range:
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:
// range = '[-infinity,"2016-01-01 00:00:00+00:00")'
Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });
使用 Sequelize 提供的 Range
类型来正确输入你的范围:
import { Model, InferAttributes, Range } from '@sequelize/core';
class User extends Model<InferAttributes<User>> {
declare myDateRange: Range<Date>;
}
User.init({
myDateRange: {
type: DataTypes.RANGE(DataTypes.DATE),
allowNull: false,
}
});
Sequelize DataType | PostgreSQL | MariaDB | MySQL | MSSQL | SQLite | Snowflake | db2 | ibmi |
---|---|---|---|---|---|---|---|---|
CIDR |
CIDR |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
INET |
INET |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
MACADDR |
MACADDR |
❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
DataTypes.VIRTUAL
是一种特殊的数据类型, 用于声明虚拟属性.
它不会创建实际的列.
注意
与 GENERATED
列不同, DataTypes.VIRTUAL
列在 JavaScript 层中处理. 它们不是在数据库表上创建的.
请参阅有关生成列的问题 了解更多信息.
数据库支持更多 Sequelize 中内置的数据类型未涵盖的数据类型. 如果你需要使用这样的数据类型, 你可以创建自己的数据类型.
也可以使用原始 SQL 字符串作为属性的类型. 创建表时, 此字符串将按原样用作列的类型.
User = sequelize.define('user', {
password: {
type: 'VARBINARY(50)',
},
});
注意: Sequelize 不会对这样声明的属性进行任何额外的类型转换或验证. 请谨慎地使用!
当然, 你可以在 Sequelize 存储库 中打开功能请求 请求添加新的内置数据类型.