postgresql-простая ошибка запроса

РЕДАКТИРОВАТЬ: Теперь у меня есть лучшее представление о том, что происходит не так. Когда я выполняю этот запрос в старом psql, Я получаю следующий результат:

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

Итак, я получаю обратно 3 строки? Тем не менее, я говорю, что я возвращаюсь IO [Only String], Я уверен, что это моя типовая подпись, которая портит вещи...

Я пытаюсь сделать простой запрос, используя postgresql-simple библиотека с Haskell, Мой код вставлен ниже вместе с ошибкой, которую я вижу. У кого-нибудь есть идеи?

Моя база называется verbos и в нем у меня есть таблица под названием gerund, Я могу запустить query_ который содержит: conn "SELECT 2 + 2" и это прекрасно работает. Я также могу подключиться к своей базе данных с данными по умолчанию, как указано в информации по умолчанию (пароль = '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 \" Aboneonar\"),(Basic {typoid = Oid 1043, typcategory = 'S', typdelim = ',', typname = \"varchar\"},Just \"Aboneonando\"),(Basic {typoid = Oid 1043, typcategory = 'S', typdelim = ',', typname = \"varchar\"}, просто \ "отказ от \")]", errSQLTableOid = Nothing, errSQLField = "", errHaskellType = "1 слот в целевом типе ", errMessage = " несоответствие между количеством столбцов в конвертировать и число в целевом типе "}

1 ответ

Решение

Хорошо, благодаря @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, s а также t в Gerund тип)
  • Я внимательно следил за документами [ 1] для FromRow, чтобы получить type а также instance определены.
  • Вам нужно импортировать import Database.PostgreSQL.Simple.FromRow чтобы получить доступ к таким вещам, как field,
Другие вопросы по тегам