【发布时间】: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)
如何正确使用save 方法?因此,它会在帐户不存在时添加帐户和/或在帐户已存在时更新帐户。
【问题讨论】:
-
嗨,你对此做了什么修复?,我在事务下使用 Entity manager.save,我也面临同样的问题
-
解决方法是先执行
.findOne(),如果没有找到帐户,再执行.save()。示例是上述问题中的第二个代码块。
标签: javascript orm typeorm