如何用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
相关产品推荐
相关产品推荐

