我需要使用现有的(MySql)数据库,其中已经定义了表和列的名称.
如果我正确理解文档(并且我没有找到关于这个主题的好文档,那么链接将受到高度赞赏),表名与PersistIdentity相关,因此必须以大写字母开头(事实并非如此)面对).
但是,列名自动取消大写(至少在Yesod书中暗示的内容,持久性章节,在描述自声明自动生成的代码的代码片段中),因此DB中的列必须以小写字母开头.
上面的描述确实如此吗?
我可以具体控制表到标识和列到字段的映射吗?如果没有,则自动应用于命名的规则是什么?因此禁止使用什么名字?
此外,其中一个字段是VARCHAR(30).我如何与Persistent沟通?它目前(通过yesod devel)抱怨说:
errMessage ="没有密钥长度的密钥规范中使用的BLOB/TEXT列'my_field'"
这是自动迁移的结果(我可能应该禁用它).但是,如果我想声明一个有界的VARCHAR字段 - 我可以通过Persistent及其自动迁移工具来实现吗?
谢谢,
由于链接器问题,似乎不可能将Yesod与Darcs库一起使用.我追踪了这个问题,并需要熟悉Darcs内部人员的提示来解决这个问题.
GHCi runtime linker: fatal error: I found a duplicate definition for symbol
sha256_init
whilst processing object file
/home/sebfisch/.cabal/lib/darcs-2.9.5/ghc-7.4.2/libHSdarcs-2.9.5.a
This could be caused by:
* Loading two different object files which export the same symbol
* Specifying the same object file twice on the GHCi command line
* An incorrect `package.conf' entry, causing some object to be
loaded twice.
GHCi cannot safely continue in this situation. Exiting now. Sorry.
Run Code Online (Sandbox Code Playgroud)
它似乎是由darcs和cryptohash库暴露相同的符号引起的,因为搜索相应的目标文件会显示:
# for file …Run Code Online (Sandbox Code Playgroud) 我现在正在使用Yesod框架,并且自己认为制作一个小型CMS将是一个很好的项目.
目前我正在努力实现另一种布局而不是defaultLayout.比方说,对于CMS的管理区域,您将拥有一个与defaultLayout非常不同的adminLayout.
有没有办法"复制"defaultLayout,以及如何? - 或者我应该采取另一种方法吗?
另外,我对Yesod和Haskell都很新,但我正在咀嚼它:)
编辑:
正如您所看到的,我最终回答了自己的问题.这就是说,如果有人有更好的方法来解决这个问题,我会非常乐意接受他们的问题.
我试图在我的yesod路由中以类似休息的方式指定查询,例如
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
/first/?count=#Int FirstR GET
/second/?count=#Int SecondR GET
|]
Run Code Online (Sandbox Code Playgroud)
但这给了我以下错误:
The function `FirstR' is applied to one argument,
but its type `Route HelloYesod' has none
Run Code Online (Sandbox Code Playgroud)
但是,如果我把它推#Int回到路径的一部分,那一切都很好.我假设这是因为路由不是用参数生成的?
有没有办法在我的路线中指定该参数?
我只是在学习Yesod/Haskell.
在下面的代码(http://www.yesodweb.com/book/restful-content)中有两件我不理解的事情(以及随后的问题).
{..}- 那是什么意思?(对谷歌而言,这是一个艰难的术语.)person@Person- @标志做什么?码:
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Text (Text)
import Yesod
data Person = Person
{ name :: Text
, age :: Int
}
instance ToJSON Person where
toJSON Person {..} = object
[ "name" .= name
, "age" .= age
]
data App = App
mkYesod "App" [parseRoutes|
/ HomeR GET
|] …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建使用AJAX与服务器通信的简单页面(Yesod).到目前为止,我设法从服务器传递数据,但我不知道如何使用服务器处理程序(putJsonpR)获取客户端数据.
这是我到目前为止:
{-# LANGUAGE OverloadedStrings, DeriveGeneric #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
import Yesod
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromRow
import Database.PostgreSQL.Simple.ToRow
import Database.PostgreSQL.Simple.ToField
import Data.Aeson
import Data.Text (Text)
import Control.Applicative
import Control.Monad
import GHC.Generics
data HelloWorld = HelloWorld
mkYesod "HelloWorld" [parseRoutes|
/ HomeR GET
/json/#Int JsonR GET
/json JsonpR PUT
|]
instance Yesod HelloWorld
data Person = Person {
personId :: Int,
name :: String,
age :: Int
} deriving …Run Code Online (Sandbox Code Playgroud) 我有一个ajax调用将json发送到Yesod中的路由,我希望路由解析json并将其直接插入数据库.在我的模型文件中
createtime UTCTime default=now()
Run Code Online (Sandbox Code Playgroud)
因为客户端没有发送创建时间,所以这会阻止解析json.我尝试为日志条目编写自己的parseJson,但由于getCurrentTime在IO monad中返回一个值,因此我无法插入UTCTime默认值.如果可能的话,我希望数据库设置值.
在这一点上我唯一能想到的就是创建一个像LogEntryWithoutTime这样的类型,将JSON解析为它并转换为LogEntry.有没有更简单的方法?
编辑: 我显示三个不同的失败,将getCurrentTime添加到JSON解析.首先,目的是解析createtime(如果可用),并默认为服务器上的getCurrentTime.不管怎样,这是不对的,因为我们不应该依赖客户的时间.
instance FromJSON Log where
parseJSON (Object o) = Log
<$> o .: "userid"
...
<*> o .:? "createtime" .!= liftIO getCurrentTime
Run Code Online (Sandbox Code Playgroud)
错误是
Model.hs:58:32:
Couldn't match expected type ‘UTCTime’
with actual type ‘m0 UTCTime’
In the second argument of ‘(.!=)’, namely ‘liftIO getCurrentTime’
In the second argument of ‘(<*>)’, namely
‘o .:? "createtime" .!= liftIO getCurrentTime’
Run Code Online (Sandbox Code Playgroud)
其次,我试着获得当前时间.
<*> liftIO getCurrentTime
Run Code Online (Sandbox Code Playgroud)
我得到了错误
Model.hs:58:9:
No instance for (MonadIO
aeson-0.7.0.6:Data.Aeson.Types.Internal.Parser)
arising from a use of …Run Code Online (Sandbox Code Playgroud) 我正在尝试跟随Yesod的烹饪书籍进行博客.我改变了一些东西,比如切换到PostgreSQL数据库,添加一个用于GoogleEmail身份验证的链接,以及将一些莎士比亚模板移动到单独的文件中.
我的问题是,当我运行应用程序并尝试进行身份验证时,我会收到一个TlsNotSupported异常,我不知道是什么导致它或如何查找.我在一个单独的应用程序中使用了两种形式的身份验证,两者都运行良好.
我的代码如下.任何帮助将不胜感激.
{-# LANGUAGE OverloadedStrings, TypeFamilies, QuasiQuotes,
TemplateHaskell, GADTs, FlexibleContexts,
MultiParamTypeClasses, DeriveDataTypeable #-}
import Yesod
import Yesod.Auth
import Yesod.Form.Nic (YesodNic, nicHtmlField)
import Yesod.Auth.BrowserId (authBrowserId, def)
import Yesod.Auth.GoogleEmail (authGoogleEmail)
import Data.Text (Text)
import Network.HTTP.Client (defaultManagerSettings)
import Network.HTTP.Conduit (Manager, newManager)
import Database.Persist.Postgresql
( ConnectionString, ConnectionPool, SqlPersistT, runSqlPool, runMigration
, withPostgresqlPool, runSqlPersistMPool
)
import Data.Time (UTCTime, getCurrentTime)
import Control.Applicative ((<$>), (<*>), pure)
import Data.Typeable (Typeable)
import Text.Hamlet (hamletFile)
import Text.Lucius (luciusFile)
share [mkPersist sqlOnlySettings, mkMigrate "migrateAll"]
[persistLowerCase|
User …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用该cached函数来防止在不同的小部件和处理程序中进行多个数据库查询:
newtype CachedBobId key
= CachedBobId { unCachedBobId :: key }
deriving Typeable
getBob' :: Handler BobId
getBob' = do
uncle <- runInputGet $ ireq textField "bobsuncle"
(Entity bob _) <- runDB $ getBy404 $ UniqueBob uncle
return bob
getBob :: Handler BobId
getBob = do
a <- getBob'
let b = return $ CachedBobId a
c <- cached b
return $ unCachedBobId c
Run Code Online (Sandbox Code Playgroud)
并在某个小部件中:
renderDerp :: Widget
renderDerp = do
--these are used in the shakespeare files …Run Code Online (Sandbox Code Playgroud) 是否可以在Yesod中重命名子网站的端点?
例如,我不想使用yesod-auth提供的/ login或/ email/register,而是将它们称为"/ entrar"和"/ cadastrar"(分别是他们的PT-BR对应物).
我设法做到这一点的唯一方法是设置我stack.yaml使用修改后的本地副本yesod-auth,但我想知道是否有更好的方法.