Leoric 通过 DataTypes 对象提供一组数据类型,用于在静态属性或装饰器中定义模型字段。
import { Bone, DataTypes } from 'leoric';
const { STRING, BIGINT, TEXT, BOOLEAN } = DataTypes;
class User extends Bone {
static attributes = {
id: { type: BIGINT, primaryKey: true },
name: { type: STRING(100), allowNull: false },
bio: TEXT,
active: BOOLEAN,
}
}
STRING(length)变长字符串,映射到 SQL 的 VARCHAR。
| 参数 | 默认值 | 说明 |
|---|---|---|
length |
255 |
最大字符串长度 |
STRING // VARCHAR(255)
STRING(100) // VARCHAR(100)
CHAR(length)定长字符串。
CHAR // CHAR(255)
CHAR(10) // CHAR(10)
TEXT(length)长文本类型。length 参数控制大小变体。
| 变体 | SQL 类型 |
|---|---|
TEXT |
TEXT |
TEXT('tiny') |
TINYTEXT |
TEXT('medium') |
MEDIUMTEXT |
TEXT('long') |
LONGTEXT |
import { DataTypes, LENGTH_VARIANTS } from 'leoric';
TEXT // TEXT
TEXT(LENGTH_VARIANTS.tiny) // TINYTEXT
TEXT(LENGTH_VARIANTS.medium) // MEDIUMTEXT
TEXT(LENGTH_VARIANTS.long) // LONGTEXT
INTEGER(length)32 位整数。支持 UNSIGNED 和 ZEROFILL 修饰符。
INTEGER // INTEGER
INTEGER(10) // INTEGER(10)
INTEGER.UNSIGNED // INTEGER UNSIGNED
TINYINT(length)8 位整数。
TINYINT // TINYINT
TINYINT(1) // TINYINT(1) - MySQL 中常用作布尔值
TINYINT.UNSIGNED // TINYINT UNSIGNED
SMALLINT(length)16 位整数。
SMALLINT // SMALLINT
SMALLINT.UNSIGNED // SMALLINT UNSIGNED
MEDIUMINT(length)24 位整数。
MEDIUMINT // MEDIUMINT
MEDIUMINT.UNSIGNED // MEDIUMINT UNSIGNED
BIGINT(length)64 位整数。常用于主键。
BIGINT // BIGINT
BIGINT.UNSIGNED // BIGINT UNSIGNED
注意:JavaScript 无法安全表示大于
Number.MAX_SAFE_INTEGER(2^53 - 1)的整数。对于超大数值,返回值可能是字符串。
DECIMAL(precision, scale)定点小数类型,适用于金融数据。
DECIMAL // DECIMAL
DECIMAL(10, 2) // DECIMAL(10,2) - 共 10 位,小数点后 2 位
DECIMAL.UNSIGNED // DECIMAL UNSIGNED
BOOLEAN布尔类型,映射到 SQL 的 BOOLEAN。
BOOLEAN // BOOLEAN
DATE(precision, timezone)日期时间类型,映射到 SQL 的 DATETIME 或 TIMESTAMP。
| 参数 | 默认值 | 说明 |
|---|---|---|
precision |
— | 小数秒精度(0-6) |
timezone |
true |
启用时区支持(仅 PostgreSQL) |
DATE // DATETIME
DATE(3) // DATETIME(3) - 毫秒精度
DATE(6) // DATETIME(6) - 微秒精度
DATEONLY仅日期类型,不含时间部分。映射到 SQL 的 DATE。
DATEONLY // DATE
BINARY(length)定长二进制数据。
BINARY // BINARY(255)
BINARY(16) // BINARY(16)
VARBINARY(length)变长二进制数据。
VARBINARY // VARBINARY
VARBINARY(255) // VARBINARY(255)
BLOB(length)二进制大对象。
| 变体 | SQL 类型 |
|---|---|
BLOB |
BLOB |
BLOB('tiny') |
TINYBLOB |
BLOB('medium') |
MEDIUMBLOB |
BLOB('long') |
LONGBLOB |
JSONJSON 文本类型。在数据库中存储为 TEXT,但自动进行序列化/反序列化。
import { DataTypes } from 'leoric';
class Post extends Bone {
static attributes = {
meta: DataTypes.JSON,
}
}
JSONB原生 JSON 二进制类型。在 PostgreSQL 和 MySQL 5.7+ 中可用,以原生 JSON 类型存储。
class Post extends Bone {
static attributes = {
extra: DataTypes.JSONB,
}
}
更多关于查询和更新 JSON 数据的内容,请参阅 JSON 字段。
VIRTUAL虚拟列,不会持久化到数据库。适用于计算属性。
class User extends Bone {
static attributes = {
firstName: STRING,
lastName: STRING,
fullName: {
type: VIRTUAL,
get() {
return `${this.firstName} ${this.lastName}`;
},
},
}
}
LENGTH_VARIANTS 枚举为 TEXT 和 BLOB 类型提供命名大小变体:
import { LENGTH_VARIANTS } from 'leoric';
LENGTH_VARIANTS.tiny // 'tiny'
LENGTH_VARIANTS.empty // ''(默认)
LENGTH_VARIANTS.medium // 'medium'
LENGTH_VARIANTS.long // 'long'
使用 TypeScript 时,数据类型可以通过 @Column 装饰器指定:
import { Bone, Column, DataTypes } from 'leoric';
const { TEXT, SMALLINT, JSONB } = DataTypes;
class User extends Bone {
@Column({ primaryKey: true })
id: bigint;
@Column()
name: string; // 推断为 STRING
@Column({ type: SMALLINT })
age: number; // 覆盖:使用 SMALLINT 而非 INTEGER
@Column(TEXT)
bio: string; // 覆盖:使用 TEXT 而非 STRING
@Column(JSONB)
meta: Record<string, unknown>;
@Column()
createdAt: Date; // 推断为 DATE
}
更多类型推断详情请参阅 TypeScript 支持。
| Leoric 类型 | MySQL | PostgreSQL | SQLite |
|---|---|---|---|
STRING |
VARCHAR |
VARCHAR |
TEXT |
TEXT |
TEXT |
TEXT |
TEXT |
INTEGER |
INT |
INTEGER |
INTEGER |
BIGINT |
BIGINT |
BIGINT |
INTEGER |
BOOLEAN |
TINYINT(1) |
BOOLEAN |
INTEGER |
DATE |
DATETIME |
TIMESTAMP |
TEXT |
DATEONLY |
DATE |
DATE |
TEXT |
JSONB |
JSON |
JSONB |
TEXT |
BLOB |
BLOB |
BYTEA |
BLOB |
DECIMAL |
DECIMAL |
DECIMAL/NUMERIC |
REAL |