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
相关产品推荐
相关产品推荐

