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
,