我正在使用yesod创建一个简单的网站.
它一直工作,直到我向我的数据库模型添加了UTCTime类型的字段.
我最初得到一个错误,建议我在我的cabal文件中添加"time-1.2.0.3",所以我做了,现在我得到了相同的错误,没有建议:
Model.hs:6:8:
Could not find module `Data.Time.Clock.UTC':
it is a hidden module in the package `time-1.2.0.3'
Use -v to see a list of the files searched for.
Run Code Online (Sandbox Code Playgroud)
cabal生成的ghc命令行是:
"C:\Program Files (x86)\Haskell Platform\2011.2.0.1\bin\ghc.exe" --make -o dist\build\lpi\lpi.exe -hide-all-packages -fbuilding-cabal-package -package-conf dist\package.conf.inplace -i -idist\build\lpi\lpi-tmp -i. -idist\build\autogen -Idist\build\autogen -Idist\build\lpi\lpi-tmp -optP-DPRODUCTION -optP-include -optPdist\build\autogen\cabal_macros.h -odir dist\build\lpi\lpi-tmp -hidir dist\build\lpi\lpi-tmp -stubdir dist\build\lpi\lpi-tmp -package-id base-4.3.1.0-f520cd232cc386346843c4a12b63f44b -package-id bytestring-0.9.1.10-cd85f14e02463c02ba4c77d7adcdb54f -package-id clientsession-0.7.3.6-70ebb09e2b4c14267f1463cef3c932ea -package-id hamlet-0.10.5-1bacb5fe791e5cc9e28c8cf9f07c06e2 -package-id hjsmin-0.0.14-a1d374204877c150b681896452f205f4 -package-id mime-mail-0.4.1.0-05d76f10c6f18f7178113a6d760f371a -package-id monad-control-0.3.1-092d8fe82727181557b850f795f847bc -package-id persistent-0.6.4.3-6e59b956a206ce4f4a9296367507c2b8 -package-id persistent-sqlite-0.6.2.1-d32462e51baa09b53b6fd83dae922fc7 -package-id shakespeare-css-0.10.4-f8e17e4528d3a37edee74b13441720de -package-id shakespeare-js-0.10.3-dfec6b68f60671528332da06c9799659 -package-id shakespeare-text-0.10.3-a0ae9b85c3588ff2572080a6d1cdd4c3 …Run Code Online (Sandbox Code Playgroud) 如何以模块化方式编写Database.Esqueleto查询,以便在定义"基本"查询和相应的结果集之后,我可以通过添加其他内部联接和表达式来限制结果集.
此外,如何将返回实体(或字段元组)列表的基本查询转换为计算结果集的查询,因为基本查询不是这样执行的,而是使用LIMIT和OFFSET修改它的版本.
Yesod Book中采用的以下不正确的Haskell代码片段有望澄清我的目标.
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies, OverloadedStrings #-}
{-# LANGUAGE GADTs, FlexibleContexts #-}
import qualified Database.Persist as P
import qualified Database.Persist.Sqlite as PS
import Database.Persist.TH
import Control.Monad.IO.Class (liftIO)
import Data.Conduit
import Control.Monad.Logger
import Database.Esqueleto
import Control.Applicative
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
name String
age Int Maybe
deriving Show
BlogPost
title String
authorId PersonId
deriving Show
Comment
comment String
blogPostId BlogPostId
|]
main :: IO ()
main = runStdoutLoggingT $ runResourceT $ PS.withSqliteConn …Run Code Online (Sandbox Code Playgroud) 基于我之前的问题,我想询问是否有办法在GHCi会话中杀死所有用户创建的线程?
这样做的原因是当一个函数退出GHCi时,它产生的线程不会自动终止,即使通过代码重新加载也会持久化.重新启动GHCi解决了这个问题,但由于我的应用程序需要一段时间才能加载,如果有可能(甚至是hacky)的解决方法,那将会很棒.
我正在haskell和yesod web框架中构建一个站点作为辅助项目,我想要做的是创建一个Facebook应用程序,让用户搜索他们的墙和他们的朋友和组的墙.
我考虑过使用JavaScript SDK,但是大部分工作都会在postSearhR辅助函数调用的辅助函数后面发生,所以这样就行不通了.
搜索谷歌的短语'haskell'构建Facebook应用程序"'并且变体不会变成任何东西,一眼看到hackage在版本0.30显示一个名为happstack-facebok的包,没有任何黑头鳕文档的方式.使用haskell和facebook标签搜索SO也不会返回任何有用的内容.
有谁知道我可以使用的一个例子?
我想使用Yesod和websockets(html5)创建一个网站.
我可以使用带有Yesod webframework的websockets吗?
我正在尝试安装我的第一个脚手架Yesod应用程序.当我运行cabal-dev install && yesod --dev devel它失败时使用ExitFailure 1.我使用sqlite进行持久化.
Application.hs:49:44:
No instance for (monad-logger-0.3.1:Control.Monad.Logger.MonadLogger
IO)
arising from a use of `runMigration'
Possible fix:
add an instance declaration for
(monad-logger-0.3.1:Control.Monad.Logger.MonadLogger IO)
In the second argument of `Database.Persist.Store.runPool', namely
`(runMigration migrateAll)'
In a stmt of a 'do' block:
Database.Persist.Store.runPool dbconf (runMigration migrateAll) p
In the expression:
do { manager <- newManager def;
s <- staticSite;
dbconf <- withYamlEnvironment
"config/sqlite.yml" (appEnv conf) Database.Persist.Store.loadConfig
>>= Database.Persist.Store.applyEnv;
p <- Database.Persist.Store.createPoolConfig
(dbconf :: PersistConfig);
.... } …Run Code Online (Sandbox Code Playgroud) 在我的Yesod项目中,我有以下路线:
/api/hide/thread/#Text/#Int ApiHideThreadR GET
Run Code Online (Sandbox Code Playgroud)
我想用javascript在客户端请求它:
function hideThreadCompletely(threadId, board) {
$.getJSON("/api/hide/thread/"+board+"/"+threadId, function(data) {
$('#thread-'+threadId).hide();
});
}
Run Code Online (Sandbox Code Playgroud)
但我无法使用,@{ApiHideTHreadR}因为Yesod需要它在编译时的参数.什么是这种情况的妥善解决,如果我想API网址的样子api/board/1/1,而不是api/board?bid=1&tid=1?继续使用手动定义的URL "/api/hide/thread/"+board+"/"+threadId吗?
我想知道Handler在Yesod中为用户/权限或资源添加角色的最佳方法是什么.有没有人有这种东西的先前艺术?是否有任何方法利用类型系统来帮助防止漏洞(并且还要保持数据库查询以检查所有权等)?
编辑:很抱歉错过了这个 - 我确实注意到实际上有一个部分,我乍一看(我认为因为没有提及访问/角色/权限),在Yesod书中的授权.这似乎在路由器级别使用PUT/POST的写标志进行访问控制.它本身看起来并不十分复杂,但它看起来很适合在顶部构建抽象...
我使用Persistent orm和scotty web框架.
我希望通过id从db获取值.这些ID来自GET请求
有"获取"功能,它接受"密钥实体"变量并返回"可能实体".
我使用以下代码从db获取值
k <- keyFromValues $ [(PersistInt64 myOwnIntVarFromRequest)]
case k of
Left _ -> {-some processing-}
Right x -> do
t <- liftIO . runDb $ get (x::Key Post) --Post is one of my models
case t of
Nothing -> {-processing-}
Just x -> {-processing-}
Run Code Online (Sandbox Code Playgroud)
这些代码非常丑陋.但我不知道如何做得更好
所以我的问题是如何在不调用keyFromValues的情况下获取"Key Entity"类型的变量.
PS抱歉我的英语不好
为什么user对象仍具有Nothing用于createdAt和updatedAt?为什么这些字段没有被数据库分配?
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
User
email String
createdAt UTCTime Maybe default=CURRENT_TIME
updatedAt UTCTime Maybe default=CURRENT_TIME
deriving Show
|]
main = runSqlite ":memory:" $ do
runMigration migrateAll
userId <- insert $ User "saurabhnanda@gmail.com" Nothing Nothing
liftIO $ print userId
user <- get userId
case user of
Nothing -> liftIO $ putStrLn ("coulnt find userId=" ++ (show userId))
Just u -> liftIO $ putStrLn ("user=" ++ (show user))
Run Code Online (Sandbox Code Playgroud)
输出:
UserKey {unUserKey …Run Code Online (Sandbox Code Playgroud)