如何使用Esqueleto实现基于列值计算的表字段更新
Esqueleto对应全表字段更新写法
场景说明
- 待操作数据表为
t,包含c1、c2两个字段 - 目标是将函数
fx作用于每一行的c1值,计算结果赋值给该行c2字段,单次SQL完成全表更新 - 等价PostgreSQL原生实现:
update t set c2 = fx(c1);
实现代码
Esqueleto的更新逻辑最终会转译为数据库侧执行的SQL,因此首先要绑定数据库中定义的fx函数(替换示例中的类型为你实际使用的字段类型):
-- 绑定PostgreSQL侧的自定义函数fx fx :: SqlExpr (Value C1Type) -> SqlExpr (Value C2Type) fx = unsafeSqlFunction "fx"
执行更新的核心代码:
-- 替换C1、C2为Persistent生成的对应字段构造器 runSql $ update $ \t -> do set t [ C2 =. fx (t ^. C1) ]
关键说明
- 如果
fx是仅在Haskell端定义的纯函数,无法直接嵌入上述Esqueleto语句:数据库无法调用客户端侧的Haskell函数,这类场景需要先把全表c1数据查询到Haskell进程,计算得到c2结果后再批量更新回表。 - 上述写法没有加
where过滤条件,默认会更新全表所有行,和给出的原生SQL行为完全一致。
内容的提问来源于stack exchange,提问作者Deepak Kapiswe
相关产品推荐
相关产品推荐

