XORM中Go类型与数据库字段映射必须显式标注xorm tag:int64→"bigint"、int→"integer"、int8→"smallint"、float64→"numeric(10,2)"、string→"text"、time.Time→"timestamp"/"timestamptz";跨库推荐用"created"/"updated"/"bit"等逻辑类型及"bigint"+"text"统一适配。

在使用 XORM 框架开发 Go 后端时,必须明确结构体字段的 Go 类型与数据库字段类型的映射关系,否则 Sync() 会创建错误字段、插入失败或数据截断——尤其跨 PostgreSQL/MySQL/SQLite 时,同一 Go 类型在不同库中默认映射的物理类型可能完全不同。
Go 基础类型与 PostgreSQL 字段的对应规则
PostgreSQL 是强类型数据库,XORM 不直接使用 pg 原生类型声明(如 INT8 或 TIMESTAMPTZ),而是通过 Go 类型 + tag 中的 xorm 类型标识共同决定最终建表语句。以下为最常用且经实测验证的映射:
方法一:按官方推荐方式显式标注 xorm 类型
① int64 → xorm:"bigint"(PostgreSQL 中生成 BIGINT)
② int → xorm:"integer"(生成 INTEGER,非 INT;省略时部分版本 fallback 为 INT,但不保证兼容)
③ int8 → xorm:"smallint"(必须写 smallint,否则默认映射为 SMALLINT 可能被忽略)
④ float64 → xorm:"numeric(10,2)"(【务必指定精度】,否则 PostgreSQL 默认 NUMERIC 无精度,某些驱动插入小数时会报错或四舍五入异常)
⑤ string → xorm:"text"(推荐用于长文本;若用 varchar(255),需确保业务长度不超限,否则 INSERT 时静默截断)
⑥ time.Time → xorm:"timestamp"(生成 TIMESTAMP WITHOUT TIME ZONE;如需带时区,请用 xorm:"timestamptz")
Go 类型与 MySQL 字段的对应差异
MySQL 对类型容忍度更高,但字段语义和索引行为与 PostgreSQL 显著不同。XORM 在 MySQL 下的映射更依赖驱动层解释,不能完全复用 PG 的 tag 写法。
方法1:主键与自增字段必须显式声明
Id int64 `xorm:"pk autoincr BIGINT id"` —— 这里 BIGINT 是 MySQL 物理类型关键词,【不可省略】,否则 XORM 可能生成 INT 导致 ID 溢出。
方法2:布尔值统一用 bool + xorm:"tinyint"
MySQL 没有原生 BOOLEAN 类型,实际存储为 TINYINT(1);XORM 的 BOOL tag 在 MySQL 驱动中会被转为 TINYINT,但部分旧版驱动识别不稳定,建议直接写 tinyint。
方法3:字符串唯一约束需配合长度限制
Username string `xorm:"varchar(64) notnull unique"` —— MySQL 要求 UNIQUE 字段必须有明确长度(TEXT 类型不允许加 UNIQUE),否则 Sync() 报错。
跨数据库通用字段类型写法
若项目需同时支持 PostgreSQL 和 MySQL,应避开数据库特有类型,优先选用 XORM 抽象层认可的“逻辑类型”:
方法一:用 xorm 内置逻辑类型代替物理类型关键词
CreatedAt time.Time `xorm:"created"` → 自动适配 MySQL 的 DATETIME 与 PostgreSQL 的 TIMESTAMP
UpdatedAt time.Time `xorm:"updated"` → 同上,且自动注入更新时间
IsDeleted bool `xorm:"bit"` → bit 是 XORM 跨库安全的布尔表示,MySQL 映射为 TINYINT(1),PostgreSQL 映射为 BOOLEAN
方法二:对数字类型做最小公约数处理
所有整数统一用 int64 + xorm:"bigint":MySQL 中为 BIGINT,PostgreSQL 中也为 BIGINT,避免 int 在 PG 中映射为 INTEGER、在 MySQL 中映射为 INT 引发的范围不一致问题。
方法三:字符串统一用 xorm:"text" 而非 varchar
Content string `xorm:"text"` —— TEXT 在 MySQL 和 PostgreSQL 中均支持全文索引、无长度硬限制,且 XORM 对其跨库兼容性处理最成熟。











