标签: yesod

从PersistEntity/PersistField到DB中的列名和表名的映射规则是什么

我需要使用现有的(MySql)数据库,其中已经定义了表和列的名称.

如果我正确理解文档(并且我没有找到关于这个主题的好文档,那么链接将受到高度赞赏),表名与PersistIdentity相关,因此必须以大写字母开头(事实并非如此)面对).

但是,列名自动取消大写(至少在Yesod书中暗示的内容,持久性章节,在描述自声明自动生成的代码的代码片段中),因此DB中的列必须以小写字母开头.

上面的描述确实如此吗?

我可以具体控制表到标识和列到字段的映射吗?如果没有,则自动应用于命名的规则是什么?因此禁止使用什么名字?

此外,其中一个字段是VARCHAR(30).我如何与Persistent沟通?它目前(通过yesod devel)抱怨说:

errMessage ="没有密钥长度的密钥规范中使用的BLOB/TEXT列'my_field'"

这是自动迁移的结果(我可能应该禁用它).但是,如果我想声明一个有界的VARCHAR字段 - 我可以通过Persistent及其自动迁移工具来实现吗?

谢谢,

haskell persistent yesod

7
推荐指数
1
解决办法
409
查看次数

使用Yesod和Darcs库时如何解决重复的符号错误?

由于链接器问题,似乎不可能将Yesod与Darcs库一起使用.我追踪了这个问题,并需要熟悉Darcs内部人员的提示来解决这个问题.

Yesod应用程序中使用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)

haskell darcs yesod

7
推荐指数
1
解决办法
902
查看次数

如何实现defaultLayout以外的布局

我现在正在使用Yesod框架,并且自己认为制作一个小型CMS将是一个很好的项目.

目前我正在努力实现另一种布局而不是defaultLayout.比方说,对于CMS的管理区域,您将拥有一个与defaultLayout非常不同的adminLayout.

有没有办法"复制"defaultLayout,以及如何? - 或者我应该采取另一种方法吗?

另外,我对Yesod和Haskell都很新,但我正在咀嚼它:)

编辑:

正如您所看到的,我最终回答了自己的问题.这就是说,如果有人有更好的方法来解决这个问题,我会非常乐意接受他们的问题.

haskell yesod

7
推荐指数
1
解决办法
676
查看次数

是否可以在Yesod路由中指定查询参数?

我试图在我的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回到路径的一部分,那一切都很好.我假设这是因为路由不是用参数生成的?

有没有办法在我的路线中指定该参数?

haskell yesod

7
推荐指数
1
解决办法
595
查看次数

Haskell语法:{..}和@的含义

我只是在学习Yesod/Haskell.

在下面的代码(http://www.yesodweb.com/book/restful-content)中有两件我不理解的事情(以及随后的问题).

  1. {..}- 那是什么意思?(对谷歌而言,这是一个艰难的术语.)
  2. person@Person- @标志做什么?
  3. 有没有办法可以找到不可编辑的Haskell语法的答案,而不会在StackOverflow上烦扰你们?

码:

{-# 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)

haskell yesod

7
推荐指数
2
解决办法
288
查看次数

很高兴从yesj的ajax请求中获取数据

我正在尝试创建使用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)

haskell yesod

7
推荐指数
2
解决办法
1228
查看次数

在fromJson中插入默认时间戳

我有一个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)

haskell yesod aeson

7
推荐指数
1
解决办法
462
查看次数

当我尝试登录时,为什么我的Yesod应用会抛出TlsNotSupported异常?

我正在尝试跟随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)

haskell yesod

7
推荐指数
1
解决办法
445
查看次数

如何使用yesod per-request缓存?

我正在尝试使用该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)

caching haskell yesod

7
推荐指数
1
解决办法
303
查看次数

如何在Yesod中更改子网站的URL?

是否可以在Yesod中重命名子网站的端点?

例如,我不想使用yesod-auth提供的/ login/ email/register,而是将它们称为"/ entrar"和"/ cadastrar"(分别是他们的PT-BR对应物).

我设法做到这一点的唯一方法是设置我stack.yaml使用修改后的本地副本yesod-auth,但我想知道是否有更好的方法.

haskell yesod

7
推荐指数
1
解决办法
136
查看次数

标签 统计

haskell ×10

yesod ×10

aeson ×1

caching ×1

darcs ×1

persistent ×1