gpt4 book ai didi

haskell - 如何使用 Esqueleto 执行 "SELECT ... IN (SELECT ...)"?

转载 作者:行者123 更新时间:2023-12-03 03:23:56 24 4
gpt4 key购买 nike

考虑到以下两个模型和 GET/articles/:slug/comments 请求,我想根据文章的 slug 检索属于文章的评论.

Article json sql=articles
slug Slug
title Text
description Text
body Text
createdAt UTCTime default=now()
updatedAt UTCTime Maybe default=NULL
userId UserId
UniqueSlug slug

Comment json sql=comments
body Text
createdAt UTCTime default=now()
updatedAt UTCTime Maybe default=NULL
articleId ArticleId
userId UserId

使用持久化的rawSql,我们可以按如下方式完成此任务

getCommentsForArticle :: Slug -> App (Cmts [Entity Comment])
getCommentsForArticle slug = do
comments <- runDb $ rawSql stm [toPersistValue slug]
return (Cmts comments)
where stm = "SELECT ?? FROM comments \
\WHERE article_id IN (\
\SELECT id FROM articles WHERE slug = ?)"

但是,鉴于我想维护 Haskell 和 SQL 之间的类型安全,我想使用 esqueleto 重写它。这是我正在努力解决的部分。通过阅读文档,sub_select似乎是这项工作的工具。这是我所拥有的:

getCommentsForArticle :: Slug -> App (Cmts [Comment])
getCommentsForArticle slug = do
comments <- E.select $
E.from $ \cmts -> do
let subQuery =
E.from $ \arts -> do
E.where_ $ arts ^. ArticleSlug ==. E.val slug
return (arts ^. ArticleId)
E.where_ $ cmts ^. CommentArticleId ==. E.sub_select subQuery
return cmts
return $ Cmts comments

我还注意到 in_ operator ,但我不知道如何使用它,也不知道它是否比 sub_select 更合适。 .

我错过了什么?语法正确吗?谢谢。

最佳答案

你会想要这样的东西

getCommentsForArticle slug = do
c <- select $ from $ \cmts -> do
let a = subList_select $ from $ \arts -> do
where_ $ arts ^. ArticleSlug ==. val slug
return $ arts ^. ArticleId
where_ $ cmts ^. CommentArticleId `in_` a
return cmts
return $ Cmts c

关于haskell - 如何使用 Esqueleto 执行 "SELECT ... IN (SELECT ...)"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com