KnexPg update()方法无法更新数据问题求助
解决SailsJS中Knex Update不生效的问题
我来帮你排查修复这个update操作失效的问题,你的代码里有几个关键细节没处理对:
1. 错误混用了select()和update()方法
Knex的查询构建器中,select()是用来构造查询语句的,而update()属于写入操作,这两个方法不能像你这样链式混用。正确的做法是直接针对目标表初始化操作,不需要先调用select()。
2. 数据类型不匹配导致字段未更新
你的quantitiesLockedValue是字符串'false',但数据库中该字段是布尔类型(存储的是TRUE布尔值)。PostgreSQL处理布尔字段时,会把非空字符串默认判定为true——哪怕你传的是'false'字符串,数据库也会将其当成布尔true处理,自然看不到字段变化。
3. 缺少查询执行的触发步骤
Knex的查询构建器只是生成SQL语句,并不会自动执行,你需要调用.then()(Promise方式)或者await(异步函数方式)来触发实际的数据库请求。
修复后的代码示例
// 先把字符串类型的'false'转为布尔值false const idValue = this.id; const quantitiesLockedValue = this.quantitiesLocked === 'false' ? false : true; // 直接初始化update操作,无需select() const query = knexPg('MealTemplate as m') .where('m.id', idValue) .update({ quantitiesLocked: quantitiesLockedValue }); // 执行查询并处理结果 query.then(() => { console.log('更新成功'); }).catch(err => { console.error('更新失败:', err); }); // 如果是在异步函数中,也可以用await: // await query;
额外验证小技巧
- 可以在执行前打印生成的SQL语句,确认逻辑是否正确:
console.log(query.toString());,这样能看到最终发送给数据库的SQL,方便快速排查问题。 - 检查
this.id是否正确获取到了目标记录的ID,确保where条件能精准匹配到对应的行。
内容的提问来源于stack exchange,提问作者user3143105
相关产品推荐
相关产品推荐

