typeorm - repository.save 使用 insert 而不是 update
问题描述
我将 TypeORM 的存储库模式与一个简单的表、两列、estate_num
作为主键和estateId
mysql 一起使用。
如果主键记录不存在,则该repository.save
方法应该插入,否则,更新它。
相反,我收到以下错误:
query: SELECT `estate`.`estate_num` AS `estate_estate_num`, `estate`.`estateId` AS `estate_estateId` FROM `estate` `estate` WHERE (`estate`.`estate_num` = ?) -- PARAMETERS: ["0"]
query: START TRANSACTION
query: INSERT INTO `estate`(`estate_num`, `estateId`) VALUES (?, ?) -- PARAMETERS: ["0","caae4e67796e4ac000743f009210fcb0467fdf87d0fbbf6107359cf53f5b544b79eefdfdd78f95d50301f20a9c3212cd3970af22b722e59313813e8c5d2732d0"]
query failed: INSERT INTO `estate`(`estate_num`, `estateId`) VALUES (?, ?) -- PARAMETERS: ["0","caae4e67796e4ac000743f009210fcb0467fdf87d0fbbf6107359cf53f5b544b79eefdfdd78f95d50301f20a9c3212cd3970af22b722e59313813e8c5d2732d0"]
error: { Error: ER_DUP_ENTRY: Duplicate entry '0' for key 'PRIMARY'
我可以SELECT
手动运行,我认为这决定了是否插入和更新。它返回一行,正如我对匹配项所期望的那样estate_num
。
为此的实体模型是:
@Entity()
export class Estate {
@PrimaryColumn({
name: 'estate_num',
})
estateNum: number;
@Column({
name: 'estateId',
})
estateId: string;
}
注意:estate_num
不是自动递增的,将始终提供密钥。这很奇怪,我理解。
谢谢!
解决方案
我有同样的问题。我做错了。
在我以多种方式进行操作之前,但以错误的方式进行。
首先我是这样做的:
const user = User.create({ id: 1, username: "newName" })
user.save();
给我一个错误ID Duplicate Entry
其次,我是这样做的:
const user = User.create({ id: 1, username: "newName" })
User.save(user);
同样的错误,重复输入。
第三,我是这样做的:
const user = User.findOneOrFaile(1);
const newUser = { ...user, ..req.body }
User.save(newUser);
同样的错误。
我刚得到帮助,应该这样做。您需要获取实例并将其合并使用Object.assign()
try {
const user: User = await User.findOneOrFail(id);
Object.assign(user, { ...req.body }); <---- SO ITS LIKE THIS
await user.save();
res.json({
meta: {},
payload: {
...req.body
}
});
} catch (error) {
logger.error(error);
res.status(404).json({
error
});
}
推荐阅读
- node.js - 从节点js中的存储文件中读取公钥和私钥
- mongodb - MongoDB Schema 中基于对等的验证
- iis - 为什么 IIS 不允许我更改连接字符串名称?
- java - 从路径中提取部分字符串 - Java Regex
- javascript - shallowWrapper 是空的,正在测试快照 Jest/Enzyme?
- php - 从iOS14手机收到的短信将“@”显示为“¡”
- node.js - Electron Builder 不包括嵌套的 node_modules
- java - 火花广播变量地图给出空值
- node.js - Next.Js 的服务器端
- java - java代码无法将最后一个测试用例作为输入