TypeORM是否包含一些功能来避免这种情况:
let contraption = await thingRepository.findOne({ name : "Contraption" });
if(!contraption) // Create if not exist
{
let newThing = new Thing();
newThing.name = "Contraption"
await thingRepository.save(newThing);
contraption = newThing;
}
类似于:
let contraption = await thingRepository.upsert({ name : "Contraption" });
发布于 2017-11-02 06:16:58
正如所指出的那样
Tomer Amir
,目前有部分解决方案
真正的向上插入
并且在TypeORM的存储库上打开了一个功能请求:
TypeORM upsert功能请求
部分解决方案:
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();
旧的答案实际上指向了OP所要求的“更新”方式:
已经有一种方法可以解决这个问题:
,其中的文档是这样写的:
保存数据库中所有给定的实体。如果数据库中不存在实体,则插入,否则更新。
但是如果不指定id或唯一的字段集,save方法就不能知道您引用的是现有的数据库对象。
因此,typeORM的突出之处在于:
let contraption = await thingRepository.save({id: 1, name : "New Contraption Name !"});
发布于 2021-02-17 18:57:04
对于在2021年发现这一点的任何人来说,Typeorm的
方法将在找到与主键匹配的项时进行更新或插入。这也适用于sqlite。
从文档中:
/**
* Saves all given entities in the database.
* If entities do not exist in the database then inserts, otherwise updates.
*/
发布于 2020-01-16 17:50:38
对于正在寻找向上插入多条记录并使用Postgres和TypeORM的任何人来说,您可以通过excluded关键字访问您试图更新/插入的行。
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();
https://stackoverflow.com/questions/46745688
复制相似问题