首页 > 解决方案 > 无法使用 Sequelize 更新(或保存)现有行

问题描述

当尝试.update().save()一行时,我收到此错误:

Unhandled rejection Error: You attempted to save an instance with no primary key,
this is not allowed since it would result in a global update

我尝试了文档用作示例的所有 4 种方法(有和没有定义我要保存的属性),但没有任何效果。这是我用于更新的实际代码:

Sydney.databases.guilds.findOrCreate({
  attributes: ['guildLocale'],
    where: {
      guildID: _guild.id,
    },
    defaults: {
      guildID: _guild.id,
      guildLocale: 'en_US',
      guildPrefix: '?',
    },
  }).spread((guild, created) => {
    guild.update({guildLocale: args[1]})
      .then(() => console.log(7))
      .catch((e) => throw e);
  });

这是公会模型:

let model = sequelize.define('guild', {
  guildID: {
    field: 'guild_id',
    type: DataTypes.STRING,
    primaryKey: true,
  },
  guildLocale: {
    field: 'guild_locale',
    type: DataTypes.STRING,
  },
  guildPrefix: {
    field: 'guild_prefix',
    type: DataTypes.STRING,
  },
}, {tableName: 'guilds'});

我在这里想念什么?

标签: javascriptnode.jssqlitesequelize.js

解决方案


我有同样的问题。当您指定要从数据库中获取的属性而不包括属性中的主键时,就会发生这种情况。当您尝试保存时,它会抛出以下错误:

Unhandled rejection Error: You attempted to save an instance with no primary key, this is not allowed since it would result in a global update

所以简单的解决方案是在属性中包含主键,如下所示:

Sydney.databases.guilds.findOrCreate({
  attributes: ['guildLocale', 'guildID'], // include guideID here!!
    where: {
      guildID: _guild.id,
    },
    defaults: {
      guildID: _guild.id,
      guildLocale: 'en_US',
      guildPrefix: '?',
    },
  }).spread((guild, created) => {
    guild.update({guildLocale: args[1]})
      .then(() => console.log(7))
      .catch((e) => throw e);
  });

推荐阅读