【发布时间】:2019-11-28 10:53:25
【问题描述】:
这是我的实体。
// user
@PrimaryGeneratedColumn()
public id: number;
@Column({ type: 'varchar', nullable: false })
public email: string;
@Column({ type: 'varchar', nullable: false })
public password: string;
@OneToOne(() => Token, (token: Token) => token.user)
public token: Token;
// token
@PrimaryGeneratedColumn()
public id: number;
@Column({ type: 'varchar', nullable: false })
public uuid: string;
@Column({ type: 'integer', nullable: false })
public userId: number;
@OneToOne(() => User, (user: User) => user.hash, { cascade: ['insert', 'remove'] })
@JoinColumn({ name: 'userId' })
public user: User;
这就是我在数据库中保存当前数据的方式。
private async savePayload(tokenDto: CreateTokenDto) {
const token = this.tokenRepository.create(tokenDto);
return await this.tokenRepository.save(token);
}
当我第一次将我的令牌保存到数据库时,它全部都保存了。
当我第二次保存时,出现错误。
ER_DUP_ENTRY:键“REL_d417e5d35f2434afc4bd48cb4d”的重复条目“36”
我阅读了有关保存方法的文档。但是为什么我得到错误,我不明白。我希望记录会被更新。为什么我的令牌详细信息没有更新?
我了解如何使用 sql 来做到这一点。
INSERT INTO "Tokens" (UUID, USERID)
VALUES ('d93ab036-768c-420a-98d6-2f80c79e6ae7', 36)
ON CONFLICT (USERID)
DO UPDATE SET UUID = 'd93ab036-768c-420a-98d6-2f80c79e6ae7',
USERID = 36'
经过一些实验,我注意到当我指定token id时,保存或更新是成功的。
private async savePayload(tokenDto: CreateTokenDto) {
const a = {
id: 15,
uuid: '343443443444444444444444',
userId: 36,
};
const token = this.tokenRepository.create(a);
return await this.tokenRepository.save(token);
}
但是如果我没有指明令牌的 id,我会得到一个错误。
private async savePayload(tokenDto: CreateTokenDto) {
const a = {
// id: 15,
uuid: '343443443444444444444444',
userId: 36,
};
const token = this.tokenRepository.create(a);
return await this.tokenRepository.save(token);
}
ER_DUP_ENTRY:键“REL_d417e5d35f2434afc4bd48cb4d”的重复条目“36”
我搜索并找到了一些示例。
1) TypeORM upsert - create if not exist
2) https://github.com/typeorm/typeorm/issues/3342
他们说值必须是主键或唯一值。但是我的 userId 字段是一个索引,也是唯一的。
可以有哪些选项,为什么我的令牌没有更新?
【问题讨论】:
标签: typeorm