问题标签 [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.
haskell - 在 Persistent (Haskell) 中,如何仅在记录不存在时才插入记录?
我是Haskell初学者,所以提前道歉!
我一直在这里关注 Persistent 教程。
我有一个具有唯一性约束的数据模型:
当我使用这个去insert
记录时:
如果记录已经在数据库中,它将不起作用。(它只会返回一个异常。)我可以这样做:
但问题是,我需要稍后使用authorIds
来更新Book
记录。所以我只是想知道是否有人知道一种简单的方法来插入一条记录,如果它不存在,并返回新键,或者如果它已经存在则获取记录键,这样我就有一个键数组. 此时的完整代码在此处。
haskell - 如何将 Persistent 的 SqlBackend 与自定义 monad “组合”?
我有一个用于我的仆人应用程序的自定义 monad 堆栈,我想将其保留为单个ReaderT
而不使其成为“洋葱”之类的东西SqlPersistT
。问题是,我无法找到任何执行此操作的代码示例。
似乎大多数 Persistent 函数在以下 monad 中返回一个动作:(MonadIO m, PersistRecordBackend record backend) => ReaderT backend m record
这是 的定义PersistRecordBackend
:
BaseBackend
是HasPersistentBackend
类型类的一部分:
所以,如果我走在正确的轨道上,我的自定义AppM
或者Env
将不得不实现这个HasPersistentBackend
类型类。
任何有关使这项工作的帮助将不胜感激。最后,我希望能够runSqlPool
直接调用AppM
(即没有任何形式的lift
)
haskell - 减少haskell中的类约束并检查持久表
我正在尝试设置一个基本端点,它接受一个 id 并通过一个连接表以使用持久性和 spock 返回所有连接的记录,一个工作实现看起来像这样。
问题 1:这些函数的类约束是否必须如此之大?似乎尝试编写这些 monad 会因为有这么多的限制而很快变得厌烦。我已经看到我可以使用 Constraint Kinds 来设置约束同义词,但我觉得可能我做错了什么需要这么多约束。
我还想看看是否可以编写一个更通用的方法来执行连接操作。据推测,具有输入类型和用于连接的表就足够了,编译器可以推断输出类型并且(至少在像 ruby 这样的语言中)您可以检查连接表类型以找到正确的列加入。就像是:
但是,尝试实现这样的功能超出了我的范围。我不确定传递有关用于联接的表的信息的最佳方法是什么。我实现了一个显式传递列的版本(如下),它可以工作,但它再次具有巨大的类约束,并且采用比我想要的更大的方法签名。有没有办法实现上面的签名?
haskell - Haskell 持久后端过滤器
我正在尝试将match
Sqlite3 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
在这种情况下使用的正确方法吗?
谢谢
haskell - 是否可以定义您自己的 Persistent / Esqueleto 镜片?
给定以下持久类型:
我认为生成的是一种镜头,即AccountEmail
等AccountPassphrase
。是否可以以这种方式组合这些,不一定是组合,而是说字符串连接,我经常发现自己在编写这些函数:
如果我能以类似的方式定义它会很好,Account*
这样我就可以使用而不是使用原始函数来调用它们^.
,即acc ^. AccountFullName
. 这可能不是使用这些访问器的适当方式,但如果不是,我会很想知道为什么,因为我觉得这可能有助于我进一步理解 Persistent 库的这一部分,因为当我看的时候我感到相当迷茫在周围的代码EntityField
...
haskell - NoLoggingT 不会在 Persistent 中禁用日志记录
我已经制作了这段代码,但我对两件事感到困惑:
- 为什么这两个部分的工作方式不同,一个记录而另一个没有?
- 如果添加了 NoLoggingT 包装器,为什么第二部分会记录
selectFoobars
?
代码:
可以在https://github.com/k-bx/nologesqueleto找到完全可构建的 repo
database - Haskell“持久”模型:如何正确定义交叉引用?
想象一下,您有两个模型(Foo和Bar)并且它们都相互引用(Foo具有barRef类型为BarId,Bar具有fooRef类型为FooId)。一切顺利:
但是如果我将引用类型包装为Maybe(只是一个例子,它可以是Vector或其他任何东西):
它失败并出现此错误:
我应该如何解决这个问题?
haskell - 在同一功能中混合 Esqueleto 和 Persistent
我可能会做一些非常愚蠢的事情,但我想在同一个函数中将一些 Esqueleto 与常规持久查询混合。
我有功能:
并且 loadPlanetConstructionQueue 具有签名(这个执行连接,因此我想在这里使用 Esqueleto):
这不起作用,我收到以下错误:
我认为这与“BackendCompatible SqlBackend backend”和“BaseBackend backend ~ SqlBackend”之间的区别有关。
有没有办法让这个工作?在这种情况下,我可以使用 Esqueleto 编写 selectList 部分,但更进一步,将需要使用替换,Esqueleto 不支持(我认为)。
我对 Haskell、Persistent 或 Esqueleto 了解不多,所以我在这里有点迷茫。
haskell - Haskell Esqueleto 3 表连接
这些是我从三个表中进行 SELECT 的尝试。但他们不编译,我不理解错误(我不知道为什么它需要一个元组(Entity Issue, b0)
而不是我认为代码试图获取的三元组)。
尝试1:
错误1:
尝试2:
错误2:
这是我的持久模型:
如您所见,两次尝试中的错误是相同的:它需要一个元组而不是一个三元组。
任何帮助将不胜感激 :)
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 注入的攻击媒介。所以,我对天气感到困惑,这是由攻击或其他原因引起的。有人可以解释这种行为吗?