postgresql-simple查询错误

时间:2014-11-16 01:07:23

标签: postgresql haskell postgresql-simple

编辑:我现在更好地了解出了什么问题。当我在普通的psql中执行该查询时,我得到以下结果:

lwm@verbos
=# SELECT * FROM gerund LIMIT1;                 
  infinitive │   gerund    │ gerund_english 
 ────────────┼─────────────┼────────────────
  abandonar  │ abandonando │ abandoning

所以,我回来了3个字符串?但是,我说我要回来了IO [Only String]。我确信这是我的类型签名,这是搞乱的事情......

我正在尝试使用postgresql-simple库和Haskell进行简单查询。我的代码粘贴在下面以及我看到的错误。有人有任何想法吗?

我的数据库名为verbos,在其中,我有一个名为gerund的表。我能够运行包含query_的{​​{1}},并且运行正常。我还可以使用默认信息(密码=' postgres':conn "SELECT 2 + 2"(来自文档[1])

指定的默认数据连接到我的数据库
psql -h localhost -p 5432 -U postgres

给我以下错误:

  

ConversionFailed {errSQLType =" 3个值:[(Basic {typoid = Oid 1043,   typcategory =' S',typdelim =',',typname = \" varchar \"},Just   \" abandonar \"),(基本{typoid = Oid 1043,typcategory =' S',typdelim   =',',typname = \" varchar \"},只是\" abandonando \"),(基本{typoid = Oid 1043,typcategory = ' S',typdelim =',',typname =   \" varchar \"},只是\"放弃\")]",errSQLTableOid = Nothing,   errSQLField ="",errHaskellType ="目标类型中的1个插槽",   errMessage ="要转换的列数与数字不匹配   在目标类型"}

1 个答案:

答案 0 :(得分:0)

好的,感谢@AlpMestanogullari,@ muistooshort,我在这里得到了答案。我的最终代码是:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Applicative
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromRow

data Gerund = Gerund { 
    f :: String, 
    s :: String, 
    t :: String 
} deriving (Show)

instance FromRow Gerund where 
    fromRow = Gerund <$> field <*> field <*> field

main = do
    conn <- connect defaultConnectInfo {
        connectPassword = "postgres",
        connectDatabase = "verbos"
    }
    mapM_ print =<< (query_ conn q :: IO [Gerund])
        where q = "SELECT * FROM gerund LIMIT 1"

注意:

  • 知道我的结果包含3个结果列,我需要定义一个type,其中包含结果的“空格”(fst Gerund类型)
  • 我严格按照FromRow的文档[1]来定义我的typeinstance
  • 您需要导入import Database.PostgreSQL.Simple.FromRow才能访问field
  • 等内容