sqlite - 如何编写Haskell函数来查询数据库?

标签 sqlite haskell

因此,我试图在Haskell中编写数据库层,以与SQLite DB交互。在有关数据库的章节中,我正在遵循《真实世界Haskell》一书中的说明。这是我到目前为止的内容:

{-# LANGUAGE FlexibleContexts #-}

import Database.HDBC
import Database.HDBC.Sqlite3

db = "dev.db"
conn = connectSqlite3 db

getPerson person =
  quickQuery' conn "select name from person where name like ?" [toSql person]

main :: IO ()
main = do
  print $ getPerson "Michael"


但是我得到了错误:

Could not deduce (IConnection (IO Connection))
     arising from a use of ‘quickQuery'’
   from the context: convertible-1.1.1.0:Data.Convertible.Base.Convertible
                       a SqlValue
     bound by the inferred type of
              getPerson :: convertible-1.1.1.0:Data.Convertible.Base.Convertible
                             a SqlValue =>
                           a -> IO [[SqlValue]]


作为Haskell初学者,我不太了解。我可以在getPerson上放置类型注释,但这似乎并不能解决。

最佳答案

此代码已编译

{-# LANGUAGE FlexibleContexts #-}

import Database.HDBC
import Database.HDBC.Sqlite3
import Data.Convertible.Base

db :: String
db = "dev.db"

getPerson :: (Convertible a SqlValue, IConnection conn) => conn -> a -> IO [[SqlValue]]
getPerson conn person =
  quickQuery' conn "select name from person where name like ?" [toSql person]

main :: IO ()
main = do
    conn <- connectSqlite3 db
    person <- getPerson conn "Michael"
    print person


connectSqlite3 :: FilePath -> IO Connection,因此应在conn中提取IO monad的值。

也许有更好的方法使用bind将此连接传递给quickQuery,但是我不知道,我从未使用过此库,只是从ghci中的类型猜测

关于sqlite - 如何编写Haskell函数来查询数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47448544/

相关文章:

Android Sqlite数据库测试攻略

swift sqlite count+where 总是返回 0

performance - 如何在 Haskell 中编写高效的动态规划算法?

haskell - 是否有一种灵活的方法来指定 Haskell 类型系列的返回类型?

Haskell:修改数组特定索引处的值

haskell - `onException` 的行为方式

django - 如何访问 pythonanywhere.com 上的 sqlite3?

sqlite - UWP 中的密码保护 Sqlite

sql - 每次更新数据库时都需要发出 CREATE INDEX 吗?

algorithm - 如何根据点列表有效地计算间隔列表?