如何在Haskell Persistent中通过动态ID列表查询记录
在Persistent中通过动态ID列表查询记录
嗨,这个问题其实Persistent早就给你准备好完美解决方案啦——用in_这个条件构造器就搞定了,完全不用手动拼一堆||.!
当你的ID列表是编译时未知的动态列表时,没必要手动拼接多个==.加||.来构造条件,Persistent提供的in_函数专门处理这种场景,它会被转换成SQL里的IN子句,既简洁又比手动拼接的逻辑更高效。
举个具体的例子,假设你要查询User表中ID在某个动态列表里的记录:
首先定义你的ID列表(这里只是示例,实际可能是从请求参数、其他查询结果里动态获取的):
-- 动态获取到的用户ID列表 targetUserIds :: [UserId] targetUserIds = [UserId 1, UserId 42, UserId 100]
然后对应的查询代码可以写成这样(假设在Yesod的Handler环境中执行数据库操作):
fetchUsersByIds :: [UserId] -> Handler [Entity User] fetchUsersByIds userIds = runDB $ selectList [UserId `in_` userIds] []
这里的UserId是Persistent为你的User实体自动生成的ID字段类型,in_作为中缀函数,左边是要匹配的字段,右边是目标ID列表,把这个条件传入selectList的第一个参数即可。
如果需要写一个通用的、适用于任何实体的查询函数,还可以用entityIdField来获取实体的ID字段,这样不管是User还是其他自定义实体都能复用:
fetchEntitiesByIds :: (PersistEntity a, PersistStoreWrite backend) => [Key a] -> ReaderT backend IO [Entity a] fetchEntitiesByIds ids = selectList [entityIdField `in_` ids] []
另外要提一句:如果传入的ID列表是空的,Persistent会自动处理这种边界情况,直接返回空的结果列表,不用你额外做判断逻辑,非常省心。
内容的提问来源于stack exchange,提问作者Qwertie
相关产品推荐
相关产品推荐

