首页 > 解决方案 > repository.save 使用 insert 而不是 update

问题描述

我将 TypeORM 的存储库模式与一个简单的表、两列、estate_num作为主键和estateIdmysql 一起使用。

如果主键记录不存在,则该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不是自动递增的,始终提供密钥。这很奇怪,我理解。

谢谢!

标签: typeorm

解决方案


我有同样的问题。我做错了。

在我以多种方式进行操作之前,但以错误的方式进行。

首先我是这样做的:

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
      });
    }

推荐阅读