繁体   English   中英

TypeOrm 保存方法不更新 object

[英]TypeOrm save method not updating object

考虑这个实体:

// 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)

文档中它说:

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方法? 因此,如果它不存在,它会添加一个帐户和/或在它已经存在时更新该帐户。

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

当我们使用 TypeORM .save进行更新时,它会比较 ID 来决定是向 DB 发送 CREATE 还是 UPDATE 请求。

在我的例子中,ID 是“123ce”和“123CE”,所以 TypeORM 决定创建一个新记录。 DB 响应它已经存在。

出路是检查您的数据库如何存储 ID,并为 ID 使用适当的方法。 例如, .toUpperCase()

accountIdentifier = token.oid.toUpperCase(),

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM