You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 05:12:32