比如说,在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)
但是我担心runDB在map(不会为每个用户单独向数据库发出请求?)
是否有更好/更惯用的方法来实现这一目标?
我目前正在尝试开发一个可重复使用的 Yesod 子站点来处理用户到用户的消息传递。理想情况下,用户应该能够从 Hackage 下载这个包,在他们的应用程序中提供一些钩子,并在他们的 Yesod 主站点上拥有一个现代的、功能丰富的消息系统。
但是,我找不到任何引用主站点实体的子站点示例。在这种情况下,我想为可能从主站点引用用户的消息构建持久模型。
到目前为止,我发现的 Yesod 子站点教程都没有涉及在子站点中使用 Persistent。该耶索德-意见包是我找到想什么,我建最接近的事情,但我有点被它采用的方法混淆。
首先,它似乎使用字符串来识别用户,而不是直接使用用户的id,这似乎效率低下。
此外,它似乎需要一个奇怪的回调结构(persistStorage结构)来支持评论存储,但这对我来说似乎很奇怪。在我看来,在 Haskell 中,确定要调用哪个函数所需的所有信息都应该在类和实例级别完成,但在这种情况下,我依赖于传递一堆回调,以便我的代码才能正常工作。
所以这是对 Yesod 社区的一个问题:在 Yesod 中开发这些类型的通用子站点的最佳方法是什么?
我真的很喜欢在我的项目中使用 Yesod,因为我喜欢 Haskell 以及类型安全和静态编译带来的所有东西(更不用说速度和可扩展性的好处),但我不禁感到被拉向了动态框架,如 Django 和 Rails,其中不仅有一个生态系统来构建和分发可重用组件,而且还有构建这些组件的所有库内基础设施。
我使用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)
这些步骤都没有奏效。有什么线索吗?
我正在尝试使用Database.Persistant为Scotty应用程序创建数据库,我无法弄清楚在表之间添加外键约束的语法.例如,我有一个User桌子和一个Post表,我想Post表有一个属性,authorId它引用UserId在User.这可以在原始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 author到Post块中,它编译得很好,但没有任何反应; 不会发生迁移,也不会引入外键约束.
我究竟做错了什么?任何帮助或建议将不胜感激.
为了清楚起见,我想要的是Post中的author属性来引用User中的现有用户名.
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,而我一直听到的一件事就是不要重复自己(其他语言也是如此).
无论如何......我正在尝试实现一个博客并发现需要在数据库上实现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) 当我启动Yesod应用程序时,它会生成一个名为的文件client_session_key.aes.我不需要它,因为我使用无会话身份验证.我可以阻止Yesod生成此文件吗?
我正在尝试添加
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 …
s 代码库中似乎有一些“全局变量”(unsafePerformIO+ NOINLINE)warp。尽管如此,warp从同一个main函数运行两个实例是否安全?
您好我尝试使用堆栈为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 …