问题标签 [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 投票
2 回答
409 浏览

haskell - 在 Persistent (Haskell) 中,如何仅在记录不存在时才插入记录?

我是Haskell初学者,所以提前道歉!

我一直在这里关注 Persistent 教程

我有一个具有唯一性约束的数据模型:

当我使用这个去insert记录时:

如果记录已经在数据库中,它将不起作用。(它只会返回一个异常。)我可以这样做:

但问题是,我需要稍后使用authorIds来更新Book记录。所以我只是想知道是否有人知道一种简单的方法来插入一条记录,如果它不存在,并返回新键,或者如果它已经存在则获取记录键,这样我就有一个键数组. 此时的完整代码在此处。

0 投票
0 回答
86 浏览

haskell - 如何将 Persistent 的 SqlBackend 与自定义 monad “组合”?

我有一个用于我的仆人应用程序的自定义 monad 堆栈,我想将其保留为单个ReaderT而不使其成为“洋葱”之类的东西SqlPersistT。问题是,我无法找到任何执行此操作的代码示例。

似乎大多数 Persistent 函数在以下 monad 中返回一个动作:(MonadIO m, PersistRecordBackend record backend) => ReaderT backend m record

这是 的定义PersistRecordBackend

BaseBackendHasPersistentBackend类型类的一部分:

所以,如果我走在正确的轨道上,我的自定义AppM或者Env将不得不实现这个HasPersistentBackend类型类。

任何有关使这项工作的帮助将不胜感激。最后,我希望能够runSqlPool直接调用AppM(即没有任何形式的lift

0 投票
0 回答
76 浏览

haskell - 减少haskell中的类约束并检查持久表

我正在尝试设置一个基本端点,它接受一个 id 并通过一个连接表以使用持久性和 spock 返回所有连接的记录,一个工作实现看起来像这样。

问题 1:这些函数的类约束是否必须如此之大?似乎尝试编写这些 monad 会因为有这么多的限制而很快变得厌烦。我已经看到我可以使用 Constraint Kinds 来设置约束同义词,但我觉得可能我做错了什么需要这么多约束。

我还想看看是否可以编写一个更通用的方法来执行连接操作。据推测,具有输入类型和用于连接的表就足够了,编译器可以推断输出类型并且(至少在像 ruby​​ 这样的语言中)您可以检查连接表类型以找到正确的列加入。就像是:

但是,尝试实现这样的功能超出了我的范围。我不确定传递有关用于联接的表的信息的最佳方法是什么。我实现了一个显式传递列的版本(如下),它可以工作,但它再次具有巨大的类约束,并且采用比我想要的更大的方法签名。有没有办法实现上面的签名?

0 投票
1 回答
105 浏览

haskell - Haskell 持久后端过滤器

我正在尝试将matchSqlite3 FTS3/4 表的运算符与 Persistent (在 Yesod 中)一起使用。

我已经成功创建了自己的匹配运算符:

它工作正常,但不允许使用 Sqlite3 FTS3/4 表的非常特定(奇怪?)的功能:您可以指定表名而不仅仅是列名。效果是match操作员将在表的每一列中查找搜索词。

这意味着您可以编写如下查询:

此类查询在 Sqlite3 FTS3/4 文档https://sqlite.org/fts3.html#simple_fts_queries中进行了描述

阅读 Persistent 文档和Filter定义,可能可以使用 a 创建此过滤器,BackendFilter但我还没有找到任何实际使用它的示例。

让我感到困惑的是类型族的使用,BackendSpecificFilter它在PersistFilter.

我希望能够编写如下查询:

有人可以告诉我BackFilter在这种情况下使用的正确方法吗?

谢谢

0 投票
1 回答
74 浏览

haskell - 是否可以定义您自己的 Persistent / Esqueleto 镜片?

给定以下持久类型:

我认为生成的是一种镜头,即AccountEmailAccountPassphrase。是否可以以这种方式组合这些,不一定是组合,而是说字符串连接,我经常发现自己在编写这些函数:

如果我能以类似的方式定义它会很好,Account*这样我就可以使用而不是使用原始函数来调用它们^.,即acc ^. AccountFullName. 这可能不是使用这些访问器的适当方式,但如果不是,我会很想知道为什么,因为我觉得这可能有助于我进一步理解 Persistent 库的这一部分,因为当我看的时候我感到相当迷茫在周围的代码EntityField...

0 投票
1 回答
201 浏览

haskell - NoLoggingT 不会在 Persistent 中禁用日志记录

我已经制作了这段代码,但我对两件事感到困惑:

  • 为什么这两个部分的工作方式不同,一个记录而另一个没有?
  • 如果添加了 NoLoggingT 包装器,为什么第二部分会记录selectFoobars

代码:

可以在https://github.com/k-bx/nologesqueleto找到完全可构建的 repo

0 投票
1 回答
267 浏览

database - Haskell“持久”模型:如何正确定义交叉引用?

想象一下,您有两个模型(FooBar)并且它们都相互引用(Foo具有barRef类型为BarIdBar具有fooRef类型为FooId)。一切顺利:

但是如果我将引用类型包装为Maybe(只是一个例子,它可以是Vector或其他任何东西):

它失败并出现此错误:

我应该如何解决这个问题?

0 投票
1 回答
115 浏览

haskell - 在同一功能中混合 Esqueleto 和 Persistent

我可能会做一些非常愚蠢的事情,但我想在同一个函数中将一些 Esqueleto 与常规持久查询混合。

我有功能:

并且 loadPlanetConstructionQueue 具有签名(这个执行连接,因此我想在这里使用 Esqueleto):

这不起作用,我收到以下错误:

我认为这与“BackendCompatible SqlBackend backend”和“BaseBackend backend ~ SqlBackend”之间的区别有关。

有没有办法让这个工作?在这种情况下,我可以使用 Esqueleto 编写 selectList 部分,但更进一步,将需要使用替换,Esqueleto 不支持(我认为)。

我对 Haskell、Persistent 或 Esqueleto 了解不多,所以我在这里有点迷茫。

0 投票
1 回答
237 浏览

haskell - Haskell Esqueleto 3 表连接

这些是我从三个表中进行 SELECT 的尝试。但他们不编译,我不理解错误(我不知道为什么它需要一个元组(Entity Issue, b0)而不是我认为代码试图获取的三元组)。

尝试1:

错误1:

尝试2:

错误2:

这是我的持久模型:

如您所见,两次尝试中的错误是相同的:它需要一个元组而不是一个三元组。

任何帮助将不胜感激 :)

0 投票
1 回答
92 浏览

haskell - Haskell 的 Persistent sometmes 返回 500 Internal Server Error

以下代码在 localhost:3000 启动一个 Web 服务器。

然后,加载http://localhost:3000/?author=' AND EXTRACTVALUE(0, (SELECT CONCAT('$', id, ':', pwd) FROM users LIMIT 0, 1)) #有时会导致 500 Internal Server错误,即使我们加载正常页面,例如http://localhost:3000/也会发出此错误消息

实际上,这可能是 SQL 注入的攻击媒介。所以,我对天气感到困惑,这是由攻击或其他原因引起的。有人可以解释这种行为吗?