sqlite - Haskell:Persist.sqlite - 仅选择

标签 sqlite haskell

我正在尝试使用 Persist.sqlite 来查询我的数据库,..但在目前为止我发现的所有教程中,首先我必须迁移和插入数据。只有在那之后才是选择。

但是如果我只想选择现有数据怎么办?之前没有迁移和插入?

例如在下面的代码中。如果我想跳过 buildDb 怎么办(目前这行不通)?

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE QuasiQuotes, TemplateHaskell, TypeFamilies #-}
{-# LANGUAGE OverloadedStrings, GADTs, FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module DBio where

import Data.Text (Text)
import Database.Persist
import Database.Persist.Sqlite (runSqlite, runMigrationSilent)
import Database.Persist.TH (mkPersist, mkMigrate, persistLowerCase,
       share, sqlSettings)
import Database.Persist.Sql (insert)
import Data.Conduit (($$))
import Data.Conduit.List as CL
import Control.Monad.IO.Class (liftIO)


share [mkPersist sqlSettings, mkMigrate "migrateTables"] [persistLowerCase|
Tutorial
   value    Double
   url      Text
   school   Bool
   deriving Show
|]


run :: IO ()
run = runSqlite "../DB/mind.sqlite" $ do
   buildDb
   basic <- selectList [TutorialValue >. 0.0] []
   liftIO $ print basic

buildDb = do
   --runMigrationSilent migrateTables
   insert $ Tutorial 2.22 "https://fpcomplete.com/school/basic-haskell-1" True

例如,如果我评论 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

关于sqlite - Haskell:Persist.sqlite - 仅选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632139/

相关文章:

haskell - Haskell 中的字符串连接和不需要的引号

haskell - 如何评估 Maybe 列表的最佳实践

haskell - 带分隔符的秒差距置换解析器

mysql - SQL 查询复制值 - 初学者

mysql - 为什么 Delphi (Zeos) 在我请求 unsigned big int 时在 SQLite 中给我 widestring 字段?

entity-framework - 数据库首先使用system.data.sqlite 1.0.93创建 Entity Framework 6.1.1模型

haskell - 具有MaybeT和RandT的Monad变压器堆栈

haskell - 如何在 Haskell 的列表中的每个元素上应用一个函数?

c# - Xamarin 使用SQLite 组件。无法在屏幕上查看已保存的项目

对作为输入子字符串的记录的 SQL 查询