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 ="要转换的列数与数字不匹配 在目标类型"}
答案 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"
注意:
type
,其中包含结果的“空格”(f
,s
和t
Gerund
类型)type
和instance
。 import Database.PostgreSQL.Simple.FromRow
才能访问field
。