问题标签 [haskell-persistent]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
97 浏览

yesod - 您可以在 Yesod Persist 中定义一个不可为空的可能属性吗?

我对 Yesod 还是很陌生,所以我可能会遗漏一些重要的东西。

我的理解是,将Maybe属性添加到 Persist Entity 字段似乎既使属性在数据库中不可为空,又将其包装在 Data 定义中的 Maybe 中。我尝试创建一个测试实体,其时间戳具有default=CURRENT_TIME. 如果我现在发送没有时间戳的该实体的 JSON 表示,当我尝试使用requireJsonBody. 我想我可以添加Maybe时间戳以使 JSON 解析成功。但是我不会再对数据库中的列有非空约束了吗?

0 投票
1 回答
197 浏览

haskell - 如何用 Yesod 中的 Key 值响应?

我正在为 Yesod 中的资源编写 REST API。我有一个 POST 方法,它应该尝试创建给定的资源,如果成功返回 201 和新创建资源的 ID。例如,

这是我得到的错误,这很简单:

我知道我想要一些东西ToTypedContent,但我找不到任何方法从KeyDatabase.Persist.Class 中得到它。任何帮助将不胜感激。

编辑:

这是实际资源的定义:

0 投票
1 回答
57 浏览

haskell - Yesod/Persistent 2 中 MongoDB 键的 PersistValues

我有一些代码在执行以下操作persistent < 2

(either (\_ -> 0) id).fromPersistValue.unKey.entityKey $ myEntity

如何使用现在由各个后端定义的相同功能实现相同的功能persistent > 2keys因此没有unKey功能?在较新版本的 Persistent 中,还有没有为 MongoDB 键实现这些“Int 表示”?

0 投票
0 回答
41 浏览

mysql - 是否有从现有数据库生成持久实体定义的工具?

我知道您可以使用persistent-template来声明实体,但是是否有从现有数据库构建实体的工具?具体来说,是否有一个工具可以指向 MySQL 数据库并返回 Persistent 可以使用的定义?

0 投票
2 回答
174 浏览

haskell - 内部加入持久性还是我应该使用esqueleto?

我有这个片段描述NotificationNotified实体:

现在我想写这个:

这可行,但是将通知列表提取为列表,然后使用它来选择另一个表中的内容……这并不完全正确。显然我需要在这里加入,然后我将能够有效地更新所有内容。

如何在纯中做到这一点persistent?是否有可能,在这种情况下继续persistent执行此类任务是否是个好主意?我应该esqueleto改用吗?看来我需要学习不同的 DSL 才能使用它,所以我不确定是否要切换。

如何markAsRead正确书写persistent(如果可能)?

0 投票
2 回答
514 浏览

haskell - 给定完整的密钥,获取持久记录?

我正在尝试将 Persistent 与 Servant 一起使用,因此我无法将 URL 段自动解析为 Persistent 键。相反,我已将路由设置为需要Int64,并且我想使用它来检索记录以执行主键查找。

我发现的所有内容都 指向用于toSqlKey将整数转换为键,因此我尝试编写一个非常简单的函数来为我做到这一点:

不幸的是,这不起作用。我收到以下类型错误:

有点理解这个错误——我查找了getand的类型toSqlKey,它们包括相关的约束:

如果我理解正确,backend并且PersistEntityBackend val需要是相同的类型,但toSqlKey强制执行SqlBackend约束,那么类型不匹配。我的直觉告诉我PersistentEntityBackend (Entity Record) 应该是 SqlBackend,但显然我错了。不过,我不知道为什么或如何。

无论如何,我不知道我在该分析中是对还是错,但无论哪种方式,我都不确定如何解决这个问题或这样做的正确方法是什么。给定一个整数,我如何/应该从我的数据库中获取记录?

0 投票
0 回答
144 浏览

haskell - 如果记录存在则替换记录,如果不存在则优雅地失败?

Persistent 带有两个用于批量替换记录的操作:replacerepsert. 使用repsert,如果要替换的记录最初不存在,则将新记录插入数据库。使用replace,如果要替换的记录不存在,则行为未定义

这两个选项都不足以满足我的用例:如果(且仅当)该键的记录已经存在,我想替换记录。我可以先检查记录是否存在,并且仅在返回记录时才尝试插入,但这似乎有可能出现竞争条件(尽管在这种情况下,这种竞争条件不太可能产生有害影响)。

是否有任何函数尝试进行替换并根据成功或失败返回有用的结果?

0 投票
2 回答
479 浏览

json - 使用 Servant 和 Persistent 表示 JSON 中的外键关系

今天早上我跟着这个有趣的教程学习如何使用 Servant 构建一个简单的 API 服务器。

在教程的最后,作者建议添加一个博客类型,所以我想我会试一试,但是我在尝试实现和序列化扩展教程中逻辑的外键关系时遇到了困难(也许是一个重要的此处披露:我对仆人和持久性都是新手)。

这是我的持久定义(我添加了Post):

本教程为 Servant API 构建了一个单独的Person数据类型,所以我也添加了一个名为Article

但是,现在,当我尝试创建一个将 aPost转换为的函数时Article,我在尝试处理User外键时遇到了困难:

我尝试了很多东西,但上面的内容似乎接近我想要进入的方向。但是,由于以下错误,它无法编译:

最终,我不太确定 a 到底是什么PersistEntity.Key User,我错误的谷歌搜索并没有让我更接近。

我该如何处理这种外键关系?


工作版本

感谢haoformayor编辑了答案

0 投票
1 回答
111 浏览

database - 处理变压器堆栈中的数据库访问

这个问题是关于groundhogor persistent,因为我相信两者都有相同的问题。

假设我有一个Tr m a提供一些功能的变压器f :: Int -> Tr m ()。此功能需要数据库访问。我可以在这里使用一些选项,但没有一个是令人满意的。

我可以DbPersist在里面的某个地方放一个变压器Tr。实际上,我需要将它放在顶部,因为没有PersistBackend标准转换器的实例,而且我仍然需要为我的新类型编写一个实例Tr。这已经很糟糕了,因为课程远非最小。我也可以解除我所做的每一个 db 操作。

另一种选择是更改fto的签名PersistBackend m => Int -> Tr m ()。这将再次需要PersistBackend我的Trnewtype 上的实例或提升。

现在这是真正的问题。如何Tr在已经有PersistBackend约束的上下文中运行?没有办法与它分享Tr

我可以执行第一个选项并使用一些新的连接池DbPersist在其中运行实际的转换Tr器(据我所知,无法从PersistBackend我已经在其中的上下文中获取池),或者我可以执行第二个选项并具有运行功能runTr :: PersistBackend m => Tr m a -> m a。第二个选项实际上完全没问题,但这里的问题是,DbPersist最终必须在堆栈中的某个位置,现在位于Tr变压器下方,并且没有PersistBackend标准变压器的实例Tr

这里的正确方法是什么?目前看来,最好的选择是ReaderT在堆栈中的某个地方使用一个分隔符,根据请求为我提供连接池,然后runDbConn在我想访问数据库的任何地方使用该池。看到DbPersist基本上已经只是一个ReaderT我不明白必须这样做的意义。

0 投票
0 回答
309 浏览

haskell - 持久性 selectList 类型不匹配 'Database.Persist.Sql.Types.Internal.SqlBackend'

我正在开发一个 Servant 0.7.1 应用程序并尝试使用 Persistent-2.5 来查询 Postgresql 数据库,但我得到的类型与 Persistent 查询不匹配。

此应用程序以前使用 Servant 0.4 和 Persistent 2.2,但是当我去 Servant 0.7.1 以尝试 BasicAuth 的东西(不同的stack解析器,这就是为什么我最终得到更高版本的原因Persistent)时,我从EitherT ServantErr IO到仆人的Handlermonad,由于某种原因,我无法再编译 Persistent 查询。

这是我的模型定义:

基于this blog-post,我有一个runDb看起来像这样的函数,它将在一个内部运行ReaderT

最后,我有以下 api 定义和处理程序:

我对此尝试了许多不同的变体,但总是归结为相同的错误:

似乎selectList没有返回正确的类型?


编辑:

我应该提到我正在尝试使用 Persistent 2.5 执行此操作,并且此代码以前与 Persistent 的早期版本一起使用。

看起来runSqlPool正在等待SqlPersistTReaderT SqlBackend正在selectList返回PersistEntityBackend (IO ESeries)