【问题标题】:Newbie problems with PersistentPersistent 的新手问题
【发布时间】:2012-04-17 05:02:47
【问题描述】:

所以我打算将 Persistent 0.9.0.1 与 Sqlite 一起使用,我正在阅读教程:http://www.yesodweb.com/book/persistent

带有插入和查询的简单sn-p编译失败:

-- START
{-# LANGUAGE QuasiQuotes, TypeFamilies, GeneralizedNewtypeDeriving, TemplateHaskell,
             OverloadedStrings, GADTs, FlexibleContexts #-}
import Database.Persist
import Database.Persist.TH
import Database.Persist.Sqlite
import Control.Monad.IO.Class (liftIO)

share [mkPersist sqlSettings, mkSave "entityDefs"] [persist|
Person
    name String
    age Int
|]

main = withSqliteConn ":memory:" $ runSqlConn $ do
    runMigration $ migrate entityDefs (undefined :: Person) -- this line added: that's it!
    michaelId <- insert $ Person "Michael" 26
    michael <- get michaelId
    liftIO $ print michael
-- STOP

转储拼接显示没有承诺的EqShow 生成的 Person 实例,奇怪:

data PersonGeneric (backend :: (* -> *) -> * -> *)
    = Person {personName :: String, personAge :: Int}
type Person =
    PersonGeneric Database.Persist.GenericSql.Raw.SqlPersist

我是这样破解的:

    liftIO $ putStrLn $ "name: " ++ (personName $ fromJust michael) ++ ", age: " ++ (show $ personAge $ fromJust michael)

然后insert无法从Sqlite取回主键:

Migrating: CREATE TABLE "person"("id" INTEGER PRIMARY KEY,"name" VARCHAR NOT NULL,"age" INTEGER NOT NULL)
proto: Pattern match failure in do expression at Database/Persist/GenericSql.hs:109:25-45

有什么想法吗?持久性是否适用于 Sqlite?

【问题讨论】:

  • 能否包含错误信息?是“(Show Person) 没有实例”吗?
  • @hammar 是的,在 Michael 的帮助下修复了它。

标签: sqlite haskell persistent yesod


【解决方案1】:

从 0.8 版到 0.9 版发生了变化,我们不再默认包含 EqShow 实例。要添加它们,请在age Int 下方添加以下行:

deriving Show Eq

本书仍针对Yesod 0.10版本,但我会在接下来的几天内尝试更新。

【讨论】:

  • 谢谢,这解决了我解决的第一个问题。 GenericSql.hs 中的模式匹配错误仍然存​​在。我应该为此在 Github 上提交错误吗?
  • 我在一封电子邮件中看到了类似的评论。它可能是由导管的 0.4.1 版本引起的。我在 0.4.1.1 版本中发布了一个补丁。您可以尝试升级到该版本,看看是否可以解决问题?
  • 很高兴它成功了。为了将来的使用,我建议尽可能坚持使用 yesod 平台版本的软件包,因为它们一起测试并且(至少应该)始终正常工作。
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 2012-07-16
  • 2010-12-08
  • 2011-08-13
  • 2010-12-20
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多