【问题标题】:TypeOrm save method not updating objectTypeOrm保存方法不更新对象
【发布时间】:2021-06-27 07:04:16
【问题描述】:

考虑这个实体:

// account.ts
import { Entity, PrimaryGeneratedColumn, PrimaryColumn, Column, BaseEntity, Index, CreateDateColumn,  UpdateDateColumn, OneToOne, JoinColumn } from 'typeorm'

@Entity()
export class Account extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ length: 50, unique: true })
  @Index({ unique: true })
  accountIdentifier: string

  @Column({ nullable: true, length: 100 })
  name?: string
}

要保存新的account 或返回现有的account,我们有以下工作代码:

const knownAccount = await Account.findOne({ accountIdentifier: token.oid })
if (knownAccount) return done(null, knownAccount, token)

const account = new Account()
account.accountIdentifier = token.oid
account.name = token.name
account.userName = (token as any).preferred_username
const newAccount = await account.save()
return done(null, newAccount, token)

the docs 中写道:

save - 保存给定的实体或实体数组。如果实体已存在于数据库中,则对其进行更新。如果实体在数据库中不存在,则将其插入。它将所有给定的实体保存在单个事务中(在实体的情况下,管理器不是事务性的)。还支持部分更新,因为所有未定义的属性都被跳过。返回保存的实体。

所以我们希望这段代码能够工作并替换之前的代码,但它似乎没有更新行,而是抱怨插入重复键:

const account = await Account.save({
   accountIdentifier = token.oid,
   name = token.name,
   userName = (token as any).preferred_username,
})
return done(null, account, token)

IDE 确实显示它会更新或插入,但它不会更新:

如何正确使用save 方法?因此,它会在帐户不存在时添加帐户和/或在帐户已存在时更新帐户。

【问题讨论】:

  • 嗨,你对此做了什么修复?,我在事务下使用 Entity manager.save,我也面临同样的问题
  • 解决方法是先执行.findOne(),如果没有找到帐户,再执行.save()。示例是上述问题中的第二个代码块。

标签: javascript orm typeorm


【解决方案1】:

如果它可以帮助面临同样问题的人,我认为.save() 将执行更新,以防主列(在这种情况下为 id)被精确并存在于数据库中。但是要小心,如果“id”的值是一个字符串,我不知道为什么,但是保存方法不会执行更新,而是会尝试在数据库中插入一个具有给定 id 的新实体,这可能如果 id 已经存在,则执行约束失败错误 (duplicate entry '' for key 'PRIMARY'),以避免这种简单地将 'id' 类型转换为整数。

【讨论】:

    猜你喜欢
    • 2021-07-26
    • 2021-01-04
    • 1970-01-01
    • 2020-03-05
    • 2020-07-04
    • 2018-01-22
    • 2015-11-15
    • 2012-09-11
    • 2016-04-16
    相关资源
    最近更新 更多