You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sequelize删除Postgres数据报syntax error at or near IN错误如何解决?

错误原因

你在模型定义中执行了ActionRole.removeAttribute('id')删除了Sequelize默认的主键id,但没有给模型指定新的主键。Sequelize执行单条记录的destroy()方法时,需要通过主键定位记录,缺失主键的情况下生成的SQL会缺少匹配字段,就出现了WHERE IN (...)的语法错误。

修复方案

方案1:给关联表设置复合主键(推荐)

你当前使用的是角色和操作的多对多关联中间表,roleId和actionId联合起来可以唯一标识一条记录,直接将两个字段设为联合主键即可:

'use strict';
module.exports = (sequelize, DataTypes) => {
  var ActionRole = sequelize.define('actionroles', {
    actionId: {
      type: "UNIQUEIDENTIFIER",
      field: "actionid",
      primaryKey: true // 新增配置
    },
    roleId: {
      type: "UNIQUEIDENTIFIER",
      field: "roleid",
      primaryKey: true // 新增配置
    },
    createdAt: {
      field: "createdat",
      type: DataTypes.DATE
    },
    updatedAt: {
      field: "updatedat",
      type: DataTypes.DATE
    },
  }, {});
  ActionRole.associate = function(models) {
    // associations can be defined here
  };

  ActionRole.removeAttribute('id');

  return ActionRole;
};

改完后你原有的删除接口代码不需要修改即可正常运行。

方案2:直接批量删除符合条件的记录(更高效)

你不需要先查询再删除单条记录,直接调用模型的destroy方法传入筛选条件,一步即可完成删除,还能避免额外查询的性能开销:

delete: async(roleId, actionId) => {
  return await ActionRoleModel.destroy({
    where: { roleId, actionId }
  });
}

该方案不需要修改模型定义,直接调整接口代码即可生效。

内容的提问来源于stack exchange,提问作者dokichan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 07:45:03