TypeORM软删除仅保留秒级精度,能否提升时间精度?
解决TypeORM 0.2.37 + MariaDB 11软删除时时间精度丢失问题
以下是几个可行的解决思路,按优先级排序:
1. 修正数据库连接配置
TypeORM 0.2.x对MariaDB的微秒支持需要在连接配置中显式开启相关参数,确保时间传递时不丢失精度。修改你的TypeORM配置文件:
const ormConfig: DataSourceOptions = { type: 'mariadb', host: '你的主机地址', port: 3306, username: '你的用户名', password: '你的密码', database: '你的数据库名', entities: [/* 你的实体类路径 */], synchronize: false, // 生产环境建议关闭 // 关键配置:开启微秒支持 datetimePrecision: 6, extra: { dateStrings: false, // 禁止将日期转为字符串,保留Date对象精度 timezone: 'UTC', // 统一时区,避免转换误差 supportBigNumbers: true, bigNumberStrings: false } };
2. 显式指定列的类型和精度
虽然你已经设置了@DeleteDateColumn的精度,但显式指定type为datetime并明确precision:6可以覆盖TypeORM的默认行为,确保数据库列和实体映射一致:
import { Entity, PrimaryGeneratedColumn, DeleteDateColumn, UpdateDateColumn } from 'typeorm'; @Entity() export class YourEntity { @PrimaryGeneratedColumn() id: number; @DeleteDateColumn({ type: 'datetime', precision: 6, nullable: true }) deletedAt: Date; @UpdateDateColumn({ type: 'datetime', precision: 6 }) updatedAt: Date; // 其他列... }
修改后记得重新同步或手动更新数据库表结构(如果synchronize为false)。
3. 升级TypeORM版本
TypeORM 0.2.37是较旧的版本,后续的0.2.x补丁版本或0.3.x正式版本已经修复了不少关于MariaDB时间精度的bug。如果项目允许,建议升级到0.2.x的最新稳定版(比如0.2.45),或者直接迁移到0.3.x版本(注意0.3.x有API变更,需要调整实体定义和数据源初始化代码)。
4. 手动赋值绕过自动逻辑
如果以上方法都无效,可以直接通过update方法手动设置deletedAt和updatedAt,完全控制时间值:
import { getRepository } from 'typeorm'; import { YourEntity } from './entities/YourEntity'; // 软删除示例 const softDeleteEntity = async (id: number) => { const now = new Date(); await getRepository(YourEntity).update(id, { deletedAt: now, updatedAt: now }); };
问题根源说明
TypeORM 0.2.x在处理MariaDB的datetime类型时,默认可能会将Date对象转换为仅保留整秒的字符串格式传递给数据库,即使列本身支持微秒精度。上述配置或代码调整的核心就是让TypeORM传递完整的带微秒的时间值,确保数据库能正确存储。
内容的提问来源于stack exchange,提问作者George Brooks
相关产品推荐
相关产品推荐

