9. 数据类型类 DataTypes 及其API

优质
小牛编辑
131浏览
2023-12-01

在使用sequelize.define方法定义模型时,我们一般会为模型属性(列)指定类型type,它表示数据类型,Sequelize会按指定的类型在数据库中创建字段。这些类型被定义到了sequelize模块的DataTypes类中,它是一个静态类可以直接引用其属性或方法。

  1. DataTypes
  2. DataTypes类中的API
    • 2.1 STRING() - 变长字符串
    • 2.2 CHAR() - 定长字符串
    • 2.3 TEXT() - 指定为文本列
    • 2.4 INTEGER() - 整型
    • 2.5 BIGINT() - 长整型
    • 2.6 FLOAT() - 浮点数
    • 2.7 REAL() - 浮点数
    • 2.8 DOUBLE() - 双精度浮点数
    • 2.9 DECIMAL() - 小数
    • 2.10 BOOLEAN() - 布尔
    • 2.11 TIME() - 时间类型
    • 2.12 DATE() - 日期时间类型
    • 2.13 DATEONLY() - 日期类型
    • 2.14 HSTORE() - 键/值类型
    • 2.15 JSON() - JSON字符串类型
    • 2.16 JSONB() - JSONB类型
    • 2.17 NOW() - 时间默认值
    • 2.18 BLOB() - 二进制类型
    • 2.19 RANGE() - Range类型
    • 2.20 UUID() - UUID类型
    • 2.21 UUIDV1() - UUID v1 默认值
    • 2.22 UUIDV4() - UUID v4 默认值
    • 2.23 VIRTUAL() - 虚拟值
    • 2.24 ENUM() - 枚举
    • 2.25 ARRAY() - 数组
    • 2.26 GEOMETRY() - 几何类型
    • 2.27 GEOGRAPHY() - 地理类型

1. DataTypes

DataTypes是一个含有常用数据类型的类,它用于使用sequelize.define()方法定义模型时指定列的数据类型:

sequelize.define('model', {
  column: DataTypes.INTEGER
})

注意:我们也可以通过模块的顶级对象Sequelize来引用指定的类型,如Sequelize.INTEGER,这种只是对DataTypes类中相关属性的一个便捷引用,其本质上还是引用了DataTypes类中相关属性。

在定义模型时,我们可以简单的传入一个字符串表示数据类型,但更多的时候是使用类型定义。如,使用DataTypes.BLOB时,Sequelize获取后会返回一个Buffer实例。

某些数据类型具有可访问的特殊属性,以便更改数据类型。如,与要补零得到一个无符号整数,可以使用DataTypes.INTEGER.UNSIGNED.ZEROFILL

为数据类型指定长度时,可以像函数一样引用:INTEGER(2)

NOWUUIDV1UUIDV4这三个是用于指定默认值,所以不能用于类型定义。如,定义一个UUID类型并指定默认值为v1版本的uuid:

sequelize.define('model', {
  uuid: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV1,
    primaryKey: true
  }
})

如果想想自己的算法生成自定义的UUID默认值,可以为defaultValue指定一个返回UUID的函数:

sequelize.define('model', {
  uuid: {
    type: DataTypes.UUID,
    defaultValue: function() {
      return generateMyId()
    },
    primaryKey: true
  }
})

2. DataTypes类中的API

2.1 STRING() - 变长字符串

STRING()
STRING(64)

将字段指定为变长字符串类型。默认长度为 255

可用属性:BINARY

2.2 CHAR() - 定长字符串

CHAR()
CHAR(64)

将字段指定为定长字符串类型。默认长度为 255

可用属性:BINARY

2.3 TEXT() - 指定为文本列

TEXT()

将字段指定为(无)有限长度的文本列。可用长度:tiny, medium, long

2.4 INTEGER() - 整型

INTEGER()

32位整型

可用属性:UNSIGNED,ZEROFILL

2.5 BIGINT() - 长整型

BIGINT()

64位整型

可用属性:UNSIGNED,ZEROFILL

2.6 FLOAT() - 浮点数

FLOAT()

4位精度的浮点数,接受一个或两个参数表示精度

可用属性:UNSIGNED,ZEROFILL

2.7 REAL() - 浮点数

REAL()

4位精度的浮点数,接受一个或两个参数表示精度

可用属性:UNSIGNED,ZEROFILL

2.8 DOUBLE() - 双精度浮点数

DOUBLE()

8位精度的浮点数,接受一个或两个参数表示精度

可用属性:UNSIGNED,ZEROFILL

2.9 DECIMAL() - 小数

DECIMAL()

小数,接受一个或两个参数表示精度

可用属性:UNSIGNED,ZEROFILL

2.10 BOOLEAN() - 布尔

BOOLEAN()

小数,接受一个或两个参数表示精度

2.11 TIME() - 时间类型

TIME()

指定为时间类型列

2.12 DATE() - 日期时间类型

DATE()

指定为日期时间类型列

2.13 DATEONLY() - 日期类型

DATEONLY()

指定为日期类型列

2.14 HSTORE() - 键/值类型

HSTORE()

指定为键/值类型列,仅Postgres适用

2.15 JSON() - JSON字符串类型

JSON()

指定为JSON字符串类型列,仅Postgres适用

2.16 JSONB() - JSONB类型

JSONB()

指定为预处理的JSON数据列,仅Postgres适用

2.17 NOW() - 时间默认值

NOW()

一个表示当前时间戳的默认值

2.18 BLOB() - 二进制类型

BLOB()

二进制存储类型,可用长度:tiny, medium, long

2.19 RANGE() - Range类型

RANGE()

Range类型是表示某种元素类型的值范围的数据类型,仅Postgres适用

2.20 UUID() - UUID类型

UUID()

UUID类型列,其默认值可以为UUIDV1UUIDV4

2.21 UUIDV1() - UUID v1 默认值

UUIDV1()

设置UUID类型列,的默认值为 UUID v1

2.22 UUIDV4() - UUID v4 默认值

UUIDV4()

设置UUID类型列,的默认值为 UUID v4

2.23 VIRTUAL() - 虚拟值

VIRTUAL()

一个不存储在数据库中的虚拟值。这种列在类型在需要提供一个默认值,但又不需要将其存储到数据库中时很适用。

也可以用于在重新排列和存储前进行验证。如,对密码做哈希运算前进行长度验证:

sequelize.define('user', {
  password_hash: DataTypes.STRING,
  password: {
    type: DataTypes.VIRTUAL,
    set: function (val) {
       this.setDataValue('password', val); 
       this.setDataValue('password_hash', this.salt + val);
     },
     validate: {
        isLongEnough: function (val) {
          if (val.length < 7) {
            throw new Error("Please choose a longer password")
         }
      }
    }
  }
})

在上面代码中,密码字段是存在的所以可以进行验证,但由于是虚拟类型,并不会将其存入数据库中。

别名:NONE

2.24 ENUM() - 枚举

ENUM()
DataTypes.ENUM('value', 'another value')

枚举类型

2.25 ARRAY() - 数组

ARRAY()
DataTypes.ARRAY(DataTypes.DECIMAL)

数组类型,仅Postgres适用

2.26 GEOMETRY() - 几何类型

ARRAY()
DataTypes.ARRAY(DataTypes.DECIMAL)

几何类型,仅Postgres(PostGIS)及MySQL适用。在MySQL中可用的几何类型有:'POINT'、'LINESTRING'、'POLYGON'

使用时,GeoJSON是可用的输入和返回值。

在PostGIS中,GeoJSON通过PostGIS函数ST_GeomFromGeoJSON进行转换;而在MySQL中使用GeomFromText函数。

// 创建一个点:
var point = { type: 'Point', coordinates: [39.807222,-76.984722]};

User.create({username: 'username', geometry: point }).then(function(newUser) {
...
});

// 创建一个新的线:
var line = { type: 'LineString', 'coordinates': [ [100.0, 0.0], [101.0, 1.0] ] };

User.create({username: 'username', geometry: line }).then(function(newUser) {
...
});

// 创建一个几何:
var polygon = { type: 'Polygon', coordinates: [
                [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0],
                  [100.0, 1.0], [100.0, 0.0] ] 
                ]};

User.create({username: 'username', geometry: polygon }).then(function(newUser) {
...
});

// 使用自定义的 SRID 创建点:
var point = { 
  type: 'Point', 
  coordinates: [39.807222,-76.984722],
  crs: { type: 'name', properties: { name: 'EPSG:4326'} }
};

User.create({username: 'username', geometry: point }).then(function(newUser) {
...
});

2.27 GEOGRAPHY() - 地理类型

GEOGRAPHY()

地理类型是一个二维空间对象