Haskell:Persist.sqlite-仅选择
我正试图使用Persist.sqlite来查询我的数据库,……但在我找到的所有教程中,我首先必须迁移和插入数据。只有在那之后才有了选择 但如果我只想选择现有数据,该怎么办?以前没有迁移和插入 例如,在下面的代码中。如果我想跳过buildDb(目前不起作用),该怎么办Haskell:Persist.sqlite-仅选择,sqlite,haskell,Sqlite,Haskell,我正试图使用Persist.sqlite来查询我的数据库,……但在我找到的所有教程中,我首先必须迁移和插入数据。只有在那之后才有了选择 但如果我只想选择现有数据,该怎么办?以前没有迁移和插入 例如,在下面的代码中。如果我想跳过buildDb(目前不起作用),该怎么办 我设法得到了一个有效的例子。我猜上面的问题与导入模块有关 {-# LANGUAGE OverloadedStrings, GADTs, TypeFamilies #-} {-# LANGUAGE QuasiQuotes, Templ
我设法得到了一个有效的例子。我猜上面的问题与导入模块有关
{-# LANGUAGE OverloadedStrings, GADTs, TypeFamilies #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
import Database.Persist ((>.), insertMany, Entity(..))
import Database.Persist.Sqlite (runSqlite,runMigration)
import qualified Database.Persist.TH as TH (share, mkPersist, sqlSettings,
mkMigrate, persistLowerCase)
import Control.Monad (mapM_)
import Database.Persist (selectList, entityVal)
import Database.Persist.Sqlite (runSqlite)
import Control.Monad.IO.Class (liftIO)
TH.share [TH.mkPersist TH.sqlSettings, TH.mkMigrate "migrateAll"] [TH.persistLowerCase|
MyRecord
value Int
deriving Show
|]
create :: IO ()
create = runSqlite "test.sqlite" $ do
let n = 10
runMigration migrateAll
insertMany $ map MyRecord [1..n]
return ()
get :: IO ()
get = runSqlite "test.sqlite" $ do
records <- selectList [MyRecordValue >. 9] []
liftIO $ print records
{-#语言重载字符串、GADT、类型族}
{-#语言准语言,TemplateHaskell}
{-#语言MultiparamTypeClass,GeneralizedNewtypeDeriving#-}
导入数据库.Persist(>)、insertMany、Entity(..)
导入Database.Persist.Sqlite(runSqlite,runMigration)
将限定的Database.Persist.TH导入为TH(共享、mkPersist、sqlSettings、,
mkMigrate(小写)
导入控制.Monad(mapM)
导入数据库.Persist(selectList,entityVal)
导入Database.Persist.Sqlite(runSqlite)
导入控制.Monad.IO.Class(liftIO)
TH.share[TH.mkPersist TH.sqlSettings,TH.mkMigrate“migrateAll”][TH.persist小写|
我的记录
值Int
衍生节目
|]
创建::IO()
create=runSqlite“test.sqlite”$do
设n=10
运行迁移
insertMany$map MyRecord[1..n]
返回()
get::IO()
get=runSqlite“test.sqlite”$do
记录。9] []
liftIO$打印记录
如果您的数据库中有数据,并且数据与您的模型匹配,则无需迁移。如果我在创建了数据库之后对buildDb进行了注释,…则输出时会出现错误(添加到我的原始帖子中)
No instance for (Control.Monad.IO.Class.MonadIO m0)
arising from a use of ‘insert’
The type variable ‘m0’ is ambiguous
Relevant bindings include
buildDb :: Control.Monad.Trans.Reader.ReaderT
persistent-2.2:Database.Persist.Sql.Types.SqlBackend
m0
(Key Tutorial)
(bound at DBio.hs:35:1)
Note: there are several potential instances:
instance Control.Monad.IO.Class.MonadIO m =>
Control.Monad.IO.Class.MonadIO
(conduit-1.2.5:Data.Conduit.Internal.Conduit.ConduitM i o m)
-- Defined in ‘conduit-1.2.5:Data.Conduit.Internal.Conduit’
instance Control.Monad.IO.Class.MonadIO m =>
Control.Monad.IO.Class.MonadIO
(conduit-1.2.5:Data.Conduit.Internal.Pipe.Pipe l i o u m)
-- Defined in ‘conduit-1.2.5:Data.Conduit.Internal.Pipe’
instance Control.Monad.IO.Class.MonadIO IO
-- Defined in ‘Control.Monad.IO.Class’
...plus 16 others
In the expression: insert
In a stmt of a 'do' block:
insert
$ Tutorial
2.22 "https://fpcomplete.com/school/basic-haskell-1" True
In the expression:
do { insert
$ Tutorial
2.22 "https://fpcomplete.com/school/basic-haskell-1" True }
{-# LANGUAGE OverloadedStrings, GADTs, TypeFamilies #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses, GeneralizedNewtypeDeriving #-}
import Database.Persist ((>.), insertMany, Entity(..))
import Database.Persist.Sqlite (runSqlite,runMigration)
import qualified Database.Persist.TH as TH (share, mkPersist, sqlSettings,
mkMigrate, persistLowerCase)
import Control.Monad (mapM_)
import Database.Persist (selectList, entityVal)
import Database.Persist.Sqlite (runSqlite)
import Control.Monad.IO.Class (liftIO)
TH.share [TH.mkPersist TH.sqlSettings, TH.mkMigrate "migrateAll"] [TH.persistLowerCase|
MyRecord
value Int
deriving Show
|]
create :: IO ()
create = runSqlite "test.sqlite" $ do
let n = 10
runMigration migrateAll
insertMany $ map MyRecord [1..n]
return ()
get :: IO ()
get = runSqlite "test.sqlite" $ do
records <- selectList [MyRecordValue >. 9] []
liftIO $ print records