在使用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()
地理类型是一个二维空间对象
