首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TypeORM upsert -如果不存在则创建

TypeORM upsert -如果不存在则创建
EN

Stack Overflow用户
提问于 2017-10-14 22:33:50
回答 7查看 65.9K关注 0票数 44

TypeORM是否包含一些功能来避免这种情况:

代码语言:javascript
运行
复制
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;
}

类似于:

代码语言:javascript
运行
复制
let contraption = await thingRepository.upsert({ name : "Contraption" });
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-11-02 06:16:58

正如所指出的那样

Tomer Amir

,目前有部分解决方案

真正的向上插入

并且在TypeORM的存储库上打开了一个功能请求:

TypeORM upsert功能请求

部分解决方案:

代码语言:javascript
运行
复制
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的突出之处在于:

代码语言:javascript
运行
复制
let contraption = await thingRepository.save({id: 1, name : "New Contraption Name !"});
票数 54
EN

Stack Overflow用户

发布于 2021-02-17 18:57:04

对于在2021年发现这一点的任何人来说,Typeorm的

方法将在找到与主键匹配的项时进行更新或插入。这也适用于sqlite。

从文档中:

代码语言:javascript
运行
复制
/**
 * Saves all given entities in the database.
 * If entities do not exist in the database then inserts, otherwise updates.
 */
票数 23
EN

Stack Overflow用户

发布于 2020-01-16 17:50:38

对于正在寻找向上插入多条记录并使用Postgres和TypeORM的任何人来说,您可以通过excluded关键字访问您试图更新/插入的行。

代码语言:javascript
运行
复制
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();
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46745688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档