9. 数据类型类 DataTypes 及其API
在使用sequelize.define
方法定义模型时,我们一般会为模型属性(列)指定类型type
,它表示数据类型,Sequelize会按指定的类型在数据库中创建字段。这些类型被定义到了sequelize模块的DataTypes
类中,它是一个静态类可以直接引用其属性或方法。
DataTypes
类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()
- 地理类型
- 2.1
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)
。
NOW
、UUIDV1
、UUIDV4
这三个是用于指定默认值,所以不能用于类型定义。如,定义一个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类型列,其默认值可以为UUIDV1
或UUIDV4
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()
地理类型是一个二维空间对象