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

如何用TypeORM实现带条件更新的PostgreSQL Upsert操作

基于TypeORM实现带时间条件的Upsert操作

要实现仅当新数据的createdAt晚于原有数据时才执行更新,否则忽略的Upsert操作,用两条查询会存在强一致性问题,因此可以通过TypeORM的QueryBuilder实现与目标SQL完全一致的原子化操作:

实现代码

import { getConnection } from "typeorm";

// 假设对应数据库表为t1,或替换为你的实体类T1Entity
async function batchUpsertWithTimeCondition() {
  await getConnection()
    .createQueryBuilder()
    .insert()
    .into("t1") // 若使用实体类,替换为 .into(T1Entity)
    .values([
      { id: 1, data: "data3", createdAt: new Date("2022-01-03") },
      { id: 2, data: "data3", createdAt: new Date("2022-01-02") },
    ])
    .onConflict(`("id") DO UPDATE SET 
      data = CASE WHEN EXCLUDED.createdAt > t1.createdAt THEN EXCLUDED.data ELSE t1.data END,
      createdAt = CASE WHEN EXCLUDED.createdAt > t1.createdAt THEN EXCLUDED.createdAt ELSE t1.createdAt END
    `)
    .execute();
}

关键说明

  • 该实现直接复用PostgreSQL的ON CONFLICT语法,和原始SQL逻辑完全一致,通过单语句保证原子性,解决了多查询的一致性问题。
  • 若使用实体类操作,需确保实体中id字段标记为主键(@PrimaryColumn/@PrimaryGeneratedColumn),createdAt字段类型与数据库匹配(如@Column({ type: "timestamp" }))。

内容的提问来源于stack exchange,提问作者user192344

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:35:04