0

編集:何がうまくいかないのかがよくわかりました。そのクエリをプレーンな古い形式で実行するとpsql、次の結果が得られます。

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

それで、私は3本の弦を取り戻していますか?しかし、私は戻ってきていると言いますIO [Only String]。物事を台無しにしているのは、ここでの私の型シグネチャであると確信しています...

postgresql-simpleでライブラリを使用して簡単なクエリを作成しようとしていますHaskell。私のコードは、表示されているエラーとともに以下に貼り付けられます。誰でもアイデアはありますか?

私のデータベースは呼び出されverbos、その中に というテーブルがありますgerundquery_次を含むa を実行できconn "SELECT 2 + 2"ます。これは正常に動作します。また、デフォルト情報で指定されたデフォルト データでデータベースに接続することもできます (password = 'postgres' : psql -h localhost -p 5432 -U postgres(ドキュメント[ 1 ] から)

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Monad
import Control.Applicative
import Database.PostgreSQL.Simple

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

次のエラーが表示されます。

ConversionFailed {errSQLType = "3 つの値: [(Basic {typoid = Oid 1043, typcategory = 'S', typdelim = ',', typname = \"varchar\"},Just \"放棄\"),(Basic {typoid = Oid 1043, typcategory = 'S', typdelim = ',', typname = \"varchar\"},Just \"abandonando\"),(Basic {typoid = Oid 1043, typcategory = 'S', typdelim = ' ,', typname = \"varchar\"},Just \"abandoning\")]", errSQLTableOid = Nothing, errSQLField = "", errHaskellType = "対象の型に 1 スロット", errMessage = "列数の不一致ターゲットタイプの変換と数値"}

4

1 に答える 1

0

OK、@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用の「スペース」を持つ を定義する必要がありました (と型内f) 。stGerund
  • 私は、 FromRowのドキュメント [ 1type ] に厳密に従って、自分のinstance定義を取得しました。
  • import Database.PostgreSQL.Simple.FromRowなどにアクセスするには、インポートする必要がありますfield
于 2014-11-25T04:44:47.113 に答える