Datatypes - 数据类型

以下是 sequelize 支持的一些数据类型. 有关完整和更新的列表请参阅数据类型.

  1. Sequelize.STRING // VARCHAR(255)
  2. Sequelize.STRING(1234) // VARCHAR(1234)
  3. Sequelize.STRING.BINARY // VARCHAR BINARY
  4. Sequelize.TEXT // TEXT
  5. Sequelize.TEXT('tiny') // TINYTEXT
  6. Sequelize.CITEXT // CITEXT 仅 PostgreSQL 和 SQLite.
  7. Sequelize.INTEGER // INTEGER
  8. Sequelize.BIGINT // BIGINT
  9. Sequelize.BIGINT(11) // BIGINT(11)
  10. Sequelize.FLOAT // FLOAT
  11. Sequelize.FLOAT(11) // FLOAT(11)
  12. Sequelize.FLOAT(11, 10) // FLOAT(11,10)
  13. Sequelize.REAL // REAL 仅 PostgreSQL.
  14. Sequelize.REAL(11) // REAL(11) 仅 PostgreSQL.
  15. Sequelize.REAL(11, 12) // REAL(11,12) 仅 PostgreSQL.
  16. Sequelize.DOUBLE // DOUBLE
  17. Sequelize.DOUBLE(11) // DOUBLE(11)
  18. Sequelize.DOUBLE(11, 10) // DOUBLE(11,10)
  19. Sequelize.DECIMAL // DECIMAL
  20. Sequelize.DECIMAL(10, 2) // DECIMAL(10,2)
  21. Sequelize.DATE // mysql / sqlite 为 DATETIME, postgres 为带时区的 TIMESTAMP
  22. Sequelize.DATE(6) // DATETIME(6) 适用 mysql 5.6.4+. 小数秒支持最多6位精度
  23. Sequelize.DATEONLY // DATE 不带时间.
  24. Sequelize.BOOLEAN // TINYINT(1)
  25. Sequelize.ENUM('value 1', 'value 2') // 一个允许值为'value 1'和'value 2'的ENUM
  26. Sequelize.ARRAY(Sequelize.TEXT) // 定义一个数组. 仅 PostgreSQL.
  27. Sequelize.ARRAY(Sequelize.ENUM) // 定义一个ENUM数组. 仅 PostgreSQL.
  28. Sequelize.JSON // JSON 列. 仅 PostgreSQL, SQLite 和 MySQL.
  29. Sequelize.JSONB // JSONB 列. 仅 PostgreSQL.
  30. Sequelize.BLOB // BLOB (PostgreSQL 为 bytea)
  31. Sequelize.BLOB('tiny') // TINYBLOB (PostgreSQL 为 bytea. 其余参数是 medium 和 long)
  32. Sequelize.UUID // PostgreSQL 和 SQLite 的 UUID 数据类型,MySQL 的 CHAR(36) BINARY(使用defaultValue:Sequelize.UUIDV1 或 Sequelize.UUIDV4 来让 sequelize 自动生成 id).
  33. Sequelize.CIDR // PostgreSQL 的 CIDR 数据类型
  34. Sequelize.INET // PostgreSQL 的 INET 数据类型
  35. Sequelize.MACADDR // PostgreSQL 的 MACADDR 数据类型
  36. Sequelize.RANGE(Sequelize.INTEGER) // 定义 int4range 范围. 仅 PostgreSQL.
  37. Sequelize.RANGE(Sequelize.BIGINT) // 定义 int8range 范围. 仅 PostgreSQL.
  38. Sequelize.RANGE(Sequelize.DATE) // 定义 tstzrange 范围. 仅 PostgreSQL.
  39. Sequelize.RANGE(Sequelize.DATEONLY) // 定义 daterange 范围. 仅 PostgreSQL.
  40. Sequelize.RANGE(Sequelize.DECIMAL) // 定义 numrange 范围. 仅 PostgreSQL.
  41. Sequelize.ARRAY(Sequelize.RANGE(Sequelize.DATE)) // 定义 tstzrange 范围的数组. 仅 PostgreSQL.
  42. Sequelize.GEOMETRY // Spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.
  43. Sequelize.GEOMETRY('POINT') // 带有 geometry 类型的 spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.
  44. Sequelize.GEOMETRY('POINT', 4326) // 具有 geometry 类型和 SRID 的 spatial 列. 仅 PostgreSQL (带有 PostGIS) 或 MySQL.

BLOB 数据类型允许你以字符串和 buffer 的形式插入数据. 当你在具有 BLOB 列的模型上执行 find 或 findAll 时,该数据将始终作为 buffer 返回.

如果你正在使用 PostgreSQL 不带时区的 TIMESTAMP 并且你需要将其解析为不同的时区,请使用 pg 库自己的解析器:

  1. require('pg').types.setTypeParser(1114, stringValue => {
  2. return new Date(stringValue + '+0000');
  3. // 例如,UTC偏移. 使用你想要的任何偏移量.
  4. });

除了上面提到的类型之外,integer,bigint,float 和 double 还支持 unsigned 和 zerofill 属性,这些属性可以按任何顺序组合: 请注意,这不适用于 PostgreSQL!

  1. Sequelize.INTEGER.UNSIGNED // INTEGER UNSIGNED
  2. Sequelize.INTEGER(11).UNSIGNED // INTEGER(11) UNSIGNED
  3. Sequelize.INTEGER(11).ZEROFILL // INTEGER(11) ZEROFILL
  4. Sequelize.INTEGER(11).ZEROFILL.UNSIGNED // INTEGER(11) UNSIGNED ZEROFILL
  5. Sequelize.INTEGER(11).UNSIGNED.ZEROFILL // INTEGER(11) UNSIGNED ZEROFILL

以上示例仅显示整数,但使用 bigint 和 float 可以完成相同的操作

对象表示法中的用法:

  1. // 对于枚举:
  2. class MyModel extends Model {}
  3. MyModel.init({
  4. states: {
  5. type: Sequelize.ENUM,
  6. values: ['active', 'pending', 'deleted']
  7. }
  8. }, { sequelize })

数组(ENUM)

只支持PostgreSQL.

Array(枚举)类型需要特殊处理. 每当Sequelize与数据库通信时,它必须使用ENUM名称对数组值进行类型转换.

所以这个枚举名必须遵循这个模式enum_<table_name>_<col_name>. 如果你使用sync,则会自动生成正确的名称.

Range 类型

由于 range 类型具有针对其绑定 inclusion/exclusion 的额外信息,因此不能非常简单地使用元组在javascript中表示它们.

提供 range 作为值时,你可以从以下API中进行选择:

  1. // 默认为 '["2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
  2. // 包含下限,不包含上限
  3. Timeline.create({ range: [new Date(Date.UTC(2016, 0, 1)), new Date(Date.UTC(2016, 1, 1))] });
  4. // 控制包含
  5. const range = [
  6. { value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
  7. { value: new Date(Date.UTC(2016, 1, 1)), inclusive: true },
  8. ];
  9. // '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]'
  10. // 复合形式
  11. const range = [
  12. { value: new Date(Date.UTC(2016, 0, 1)), inclusive: false },
  13. new Date(Date.UTC(2016, 1, 1)),
  14. ];
  15. // '("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00")'
  16. Timeline.create({ range });

但请注意,每当你收到一个范围值,你将收到:

  1. // 存储值: ("2016-01-01 00:00:00+00:00", "2016-02-01 00:00:00+00:00"]
  2. range // [{ value: Date, inclusive: false }, { value: Date, inclusive: true }]

在使用 range 类型更新实例后,你需要调用 reload,或使用 returning:true 参数.

特别案例

  1. // 空的范围:
  2. Timeline.create({ range: [] }); // range = 'empty'
  3. // 无边界范围:
  4. Timeline.create({ range: [null, null] }); // range = '[,)'
  5. // range = '[,"2016-01-01 00:00:00+00:00")'
  6. Timeline.create({ range: [null, new Date(Date.UTC(2016, 0, 1))] });
  7. // 无穷范围:
  8. // range = '[-infinity,"2016-01-01 00:00:00+00:00")'
  9. Timeline.create({ range: [-Infinity, new Date(Date.UTC(2016, 0, 1))] });