postgresql-simple中获取单条记录的规范处理方式咨询
在postgresql-simple中处理单条记录查询的规范方式
在postgresql-simple中,query方法返回列表结构。当通过主键等方式查询单条记录时,已知结果要么为空,要么仅包含一个元素。请问是否有框架内置的规范处理方式,还是需要自行封装函数?
目前我通过以下方式处理query返回的列表以获取单条记录:
case retrieved of [] -> throwError err404 [r] -> pure r (_r : _rs) -> throwError err500
一方面,第三种情况在主键约束下永远不会触发;此外这是一种非常常见的处理模式,理论上应该可以通过postgresql-simple的类型注解来实现。
补充说明:这种成熟的处理模式也可延伸至按主键删除等仅需影响单条记录的操作。
回答
postgresql-simple没有直接内置这种针对单条记录场景的处理函数,你需要自行封装通用函数来复用该模式。
1. 查询单条记录的封装
你可以抽象出一个通用的getSingle函数,把重复的case逻辑收拢:
getSingle :: MonadError e m => e -> e -> [a] -> m a getSingle notFoundErr multipleErr = \case [] -> throwError notFoundErr [x] -> pure x _ -> throwError multipleErr
后续使用时只需传入对应错误和查询结果即可:
getSingle err404 err500 retrieved
2. 删除单条记录的封装
对于按主键删除这类操作,可以基于execute方法返回的受影响行数(Int64类型)来封装类似逻辑:
deleteSingle :: MonadError e m => e -> e -> Int64 -> m () deleteSingle notFoundErr multipleErr rows = case rows of 0 -> throwError notFoundErr 1 -> pure () _ -> throwError multipleErr
调用时直接传入execute的返回值即可。
虽然第三种分支在主键约束的场景下理论不会触发,但保留它是良好的实践——如果业务逻辑或数据库约束出现异常(比如主键约束被意外移除),这个分支能及时抛出错误,帮助你快速定位问题。
内容的提问来源于stack exchange,提问作者Razumov
相关产品推荐
相关产品推荐

