如何使用knex简洁编写UPDATE...SET...FROM格式的SQL语句?
Knex 实现 UPDATE...SET...FROM 语句的简洁方案
你目前的手动拼接SQL的方案虽然可运行,但存在语法拼接失误、SQL注入等潜在风险,Knex 0.95及以上版本已经原生支持update方法链式调用from子句,无需手动拼接字符串,写法如下:
const result = await knex('user_subscriptions as us') .update(subscription) .from('plans as p') .where('us.customer_id', customer_id) .where('p.id', 'us.plan_id') .returning(['us.*', 'p.name'])
该写法的优势:
- 全链式调用符合Knex的API设计规范,代码可读性更高
- 自动完成参数绑定,不需要手动处理占位符,从根源避免SQL注入风险
- 生成的SQL和你手动拼接的效果完全一致,依然是单次查询返回关联表字段,没有额外性能开销
如果你使用的Knex版本低于0.95暂时无法升级,可以使用更安全的全raw写法替代字符串拼接:
const result = await knex.raw(` UPDATE user_subscriptions us SET ? FROM plans p WHERE us.customer_id = ? AND p.id = us.plan_id RETURNING us.*, p.name `, [subscription, customer_id])
内容的提问来源于stack exchange,提问作者ffxsam
相关产品推荐
相关产品推荐

