标签: yesod

Yesod/Persistent一对一查询

比如说,在Yesod/Persistent中,我有这样的模型设置:

User
    ident Text
    password Text Maybe
    UniqueUser ident
Question
    title Text
    asker UserId Eq
Run Code Online (Sandbox Code Playgroud)

我有一个Questions 列表,并希望检索相应的Users 列表.我该怎么做呢?

我考虑过加入,但这些是一对多的,而不是一对一的(我想它没关系,但我想要一个更简单的解决方案).手动进行连接也是一种选择,但我担心性能 - 我有

questions <- runDB $ selectList [QuestionTitle !=. ""] [LimitTo 10]
let askerIds = map (\(Entity _ q) -> questionAsker q) questions
askers <- sequence $ map (runDB . get) askerIds
let questionsAndAskers = zip questions askers
Run Code Online (Sandbox Code Playgroud)

但是我担心runDBmap(不会为每个用户单独向数据库发出请求?)

是否有更好/更惯用的方法来实现这一目标?

haskell yesod

3
推荐指数
1
解决办法
1254
查看次数

在 Yesod 子站点中正确使用 Persistent?

我目前正在尝试开发一个可重复使用的 Yesod 子站点来处理用户到用户的消息传递。理想情况下,用户应该能够从 Hackage 下载这个包,在他们的应用程序中提供一些钩子,并在他们的 Yesod 主站点上拥有一个现代的、功能丰富的消息系统。

但是,我找不到任何引用主站点实体的子站点示例。在这种情况下,我想为可能从主站点引用用户的消息构建持久模型。

到目前为止,我发现的 Yesod 子站点教程都没有涉及在子站点中使用 Persistent。该耶索德-意见包是我找到想什么,我建最接近的事情,但我有点被它采用的方法混淆。

首先,它似乎使用字符串来识别用户,而不是直接使用用户的id,这似乎效率低下。

此外,它似乎需要一个奇怪的回调结构(persistStorage结构)来支持评论存储,但这对我来说似乎很奇怪。在我看来,在 Haskell 中,确定要调用哪个函数所需的所有信息都应该在类和实例级别完成,但在这种情况下,我依赖于传递一堆回调,以便我的代码才能正常工作。

所以这是对 Yesod 社区的一个问题:在 Yesod 中开发这些类型的通用子站点的最佳方法是什么?

我真的很喜欢在我的项目中使用 Yesod,因为我喜欢 Haskell 以及类型安全和静态编译带来的所有东西(更不用说速度和可扩展性的好处),但我不禁感到被拉向了动态框架,如 Django 和 Rails,其中不仅有一个生态系统来构建和分发可重用组件,而且还有构建这些组件的所有库内基础设施。

haskell yesod

3
推荐指数
1
解决办法
220
查看次数

达到回跳限制(使用 --max-backjumps 更改)

我使用yesod init && cd lemonstand. 当我执行“cabal install”时,它会抛出错误,

Backjump limit reached (change with --max-backjumps).
Run Code Online (Sandbox Code Playgroud)

然后我通过了一个选项max-backjumps

cabal install --max-backjumps 100
Run Code Online (Sandbox Code Playgroud)

我跟着reddit的对话,做了这个,

cabal install --max-backjumps 100 --reorder-goals
Run Code Online (Sandbox Code Playgroud)

这些步骤都没有奏效。有什么线索吗?

haskell cabal yesod

3
推荐指数
1
解决办法
1383
查看次数

Yesod/Persistent中的外键约束?

我正在尝试使用Database.Persistant为Scotty应用程序创建数据库,我无法弄清楚在表之间添加外键约束的语法.例如,我有一个User桌子和一个Post表,我想Post表有一个属性,authorId它引用UserIdUser.这可以在原始SQL中很容易地完成,但我希望能够通过haskell访问数据而无需使用原始sql命令.此外,约束将是在数据库迁移时覆盖.这就是我目前定义数据库的方法:

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
[persistLowerCase|
   User
     name String
     email String
     username String
     Primary username
     deriving Show
   Post
     title String
     content T.Text
     author String
     deriving Show
|]
Run Code Online (Sandbox Code Playgroud)

这很好,但没有关键限制,这可能是一件非常糟糕的事情.如果我尝试在github上添加像wiki这样外键约束,通过将该行添加Foreign User authorfk authorPost块中,它编译得很好,但没有任何反应; 不会发生迁移,也不会引入外键约束.

我究竟做错了什么?任何帮助或建议将不胜感激.

为了清楚起见,我想要的是Post中的author属性来引用User中的现有用户名.

sqlite haskell persistent yesod

3
推荐指数
1
解决办法
1436
查看次数

发布并使用yesod服务器获取变量

var express = require('express')
var app = express()
var store = undefined

app.post("/", function(req, res){
  store = req.body
})

app.get("/", function(req, res){
  res.send(store)
} 
app.listen(some_port_num)
Run Code Online (Sandbox Code Playgroud)

这是一个简单的nodejs/express服务器应用程序,它将http请求主体存储在全局变量中,并在get请求中发送相同的变量作为响应.

如何在yesod/haskell中编写此代码.我不知道如何在haskell/yesod中使用全局/模块范围的变量.并且,还有其他方法可以在haskell中的两个函数之间共享变量吗?

haskell yesod

3
推荐指数
1
解决办法
101
查看次数

Haskell Persistent上的CRUD模式

这是我第二次尝试学习Haskell,而我一直听到的一件事就是不要重复自己(其他语言也是如此).

无论如何......我正在尝试实现一个博客并发现需要在数据库上实现CRUD操作,但是当我为评论,帖子和用户实现CRUD时,在我看来,我只是在重复自己.

问题是我看不出怎么不重复自己.

{-# LANGUAGE EmptyDataDecls             #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GADTs                      #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE QuasiQuotes                #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeFamilies               #-}

module Model where

import Control.Monad.IO.Class  (liftIO)
import Control.Monad.Logger    (runStderrLoggingT)
import Database.Persist
import Database.Persist.Postgresql
import Database.Persist.TH
import Data.Time
import Data.Int

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Users
    email String
    password String
    alias String
    image_url String
    show_email Bool
    UniqueEmail email
    date UTCTime default=CURRENT_TIMESTAMP …
Run Code Online (Sandbox Code Playgroud)

database haskell persistent yesod

3
推荐指数
1
解决办法
591
查看次数

阻止Yesod生成client_session_key.aes文件

当我启动Yesod应用程序时,它会生成一个名为的文件client_session_key.aes.我不需要它,因为我使用无会话身份验证.我可以阻止Yesod生成此文件吗?

haskell yesod

3
推荐指数
1
解决办法
128
查看次数

YesodAuthEmail 无法推断 m ~ HandlerFor site0

我正在尝试添加

instance YesodAuthEmail App 
Run Code Online (Sandbox Code Playgroud)

Yesod-Postgres脚手架(是 1.6 版)并陷入编译错误。

相关代码是:

instance YesodAuth App where
     type AuthId App = UserId
     ....
     authPlugins :: App -> [AuthPlugin App]
     authPlugins app = [authOpenId Claimed []] ++ extraAuthPlugins
         where extraAuthPlugins = [ authEmail ]

instance YesodAuthEmail App where
    type AuthEmailId App = UserId

    afterPasswordRoute _ = HomeR

    addUnverified email verkey =
        runDB $ insert $ User email Nothing 
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

/home/justin/code/yesodemail/src/Foundation.hs:273:11: error:
• Could not deduce: m ~ HandlerFor site0 from the context: MonadAuthHandler App …

haskell authorization type-families yesod

3
推荐指数
1
解决办法
213
查看次数

从同一个 `main` 运行两个 warp 服务器是否安全?

s 代码库中似乎有一些“全局变量”(unsafePerformIO+ NOINLINEwarp。尽管如此,warp从同一个main函数运行两个实例是否安全?

haskell yesod haskell-warp

3
推荐指数
1
解决办法
84
查看次数

Yesod和堆栈中缺少cabal依赖项

您好我尝试使用堆栈为yesod创建一个新的proyect,按照快速入门教程; 创建脚手架我使用命令:

stack new my-project yesod-postgres && cd my-project
Run Code Online (Sandbox Code Playgroud)

但是当跑步时stack exec -- yesod devel得到:

cabal: At least the following dependencies are missing:
classy-prelude >=0.10.2,
classy-prelude-conduit >=0.10.2,
classy-prelude-yesod >=0.10.2,
data-default -any,
hjsmin >=0.1 && <0.3,
monad-logger ==0.3.*,
persistent >=2.0 && <2.6,
persistent-postgresql >=2.1.1 && <2.6,
persistent-template >=2.0 && <2.6,
safe -any,
yesod >=1.4.3 && <1.5,
yesod-auth >=1.4.0 && <1.5,
yesod-core >=1.4.17 && <1.5,
yesod-form >=1.4.0 && <1.5,
yesod-static >=1.4.0.3 && <1.6
Run Code Online (Sandbox Code Playgroud)

我尝试使用该命令stack exec -- cabal install …

haskell cabal-install yesod haskell-stack

2
推荐指数
1
解决办法
148
查看次数