TypeORM+PostgreSQL下timestamp字段未自动生成问题求助
TypeORM + PostgreSQL 时间戳无法自动生成排查方案
常见故障点与修复方式
- 装饰器配置冲突问题
@CreateDateColumn装饰器本身内置了插入时自动填充时间、自动生成数据库默认值的逻辑,不需要额外手动配置default: () => 'CURRENT_TIMESTAMP',冗余配置可能和装饰器内置逻辑冲突。同时需要将字段类型和数据库实际类型完全对齐,避免类型映射不匹配,正确的实体写法如下:
@CreateDateColumn({ type: "timestamp without time zone" }) createdAt: Date;
- 表结构与实体配置不匹配
如果项目关闭了TypeORM的自动表同步(synchronize: false),手动建表时很容易漏加字段默认值、字段类型/大小写不匹配。执行以下SQL核对表结构:
-- 替换为实际表名 SELECT column_default, is_nullable, data_type FROM information_schema.columns WHERE table_name = 'post' AND column_name = 'createdAt';
如果查询结果中column_default为空,说明字段没有配置默认值,执行SQL补全即可:
ALTER TABLE post ALTER COLUMN "createdAt" SET DEFAULT CURRENT_TIMESTAMP;
注意:PostgreSQL 中驼峰命名的字段需要加双引号包裹,否则会自动转为全小写,和实体字段名匹配失败。
- 插入逻辑误传字段值
接口定义中createdAt为可选字段,需要排查插入数据的请求体、构造实体的逻辑,确认没有显式传入createdAt: null或者createdAt: undefined。只要插入参数中携带了createdAt字段(哪怕值为undefined),TypeORM就会跳过自动填充逻辑,使用传入的值写入数据库,最终出现时间戳为空的问题。不需要自定义时间时,插入参数中不要携带该字段。 - 版本兼容问题
0.2.x 系列的部分旧版本TypeORM存在PostgreSQL下@CreateDateColumn自动填充逻辑失效的已知bug,升级到0.3.x稳定版本后,重新同步表结构即可修复。
内容的提问来源于stack exchange,提问作者Anas Isah
相关产品推荐
相关产品推荐

