Persistent 的新手问题
Posted
技术标签:
【中文标题】Persistent 的新手问题【英文标题】:Newbie problems with Persistent 【发布时间】: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
转储拼接显示没有承诺的Eq
、Show
生成的 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 的帮助下修复了它。
【参考方案1】:
从 0.8 版到 0.9 版发生了变化,我们不再默认包含 Eq
和 Show
实例。要添加它们,请在age Int
下方添加以下行:
deriving Show Eq
本书仍针对Yesod 0.10版本,但我会在接下来的几天内尝试更新。
【讨论】:
谢谢,这解决了我解决的第一个问题。 GenericSql.hs 中的模式匹配错误仍然存在。我应该为此在 Github 上提交错误吗? 我在一封电子邮件中看到了类似的评论。它可能是由导管的 0.4.1 版本引起的。我在 0.4.1.1 版本中发布了一个补丁。您可以尝试升级到该版本,看看是否可以解决问题? 很高兴它成功了。为了将来的使用,我建议尽可能坚持使用 yesod 平台版本的软件包,因为它们一起测试并且(至少应该)始终正常工作。以上是关于Persistent 的新手问题的主要内容,如果未能解决你的问题,请参考以下文章