Buscamos en diferentes espacios y así brindarte la respuesta para tu inquietud, si continúas con preguntas deja la duda y responderemos sin falta, porque estamos para servirte.
Solución:
Como señaló Tomer Amir, actualmente existe una solución parcial para verdadero disgusto y se abre una solicitud de función en el repositorio de TypeORM:
Solicitud de función upsert de TypeORM
Solución parcial:
await connection.createQueryBuilder()
.insert()
.into(Post)
.values(post2)
.onConflict(`("id") DO NOTHING`)
.execute();
await connection.createQueryBuilder()
.insert()
.into(Post)
.values(post2)
.onConflict(`("id") DO UPDATE SET "title" = :title`)
.setParameter("title", post2.title)
.execute();
La respuesta anterior en realidad apunta a la forma de “actualización” de hacer lo que OP estaba pidiendo:
Ya hay un método para ello: Repository
de la cual la documentación dice:
Guarda todas las entidades dadas en la base de datos. Si las entidades no existen en la base de datos, se inserta; de lo contrario, se actualiza.
Pero si no especifica la identificación o el conjunto único de campos, el método de guardado no puede saber que se está refiriendo a un objeto de base de datos existente.
Entonces, alterar con typeORM es:
let contraption = await thingRepository.save(id: 1, name : "New Contraption Name !");
Para cualquiera que busque una forma de insertar múltiples registros y esté usando Postgres y TypeORM, puede acceder a la fila que está intentando actualizar/insertar a través de la palabra clave excluida.
const posts = [ id: 1, title: "First Post" , id: 2, title: "Second Post" ];
await connection.createQueryBuilder()
.insert()
.into(Post)
.values(posts)
.onConflict(`("id") DO UPDATE SET "title" = excluded."title"`)
.execute();
Ahora hay una biblioteca que se conecta a TypeORM para ayudar a hacer esto.
Ten en cuenta difundir esta división si te fue de ayuda.