Haskell HDBC.Sqlite3 fetchAllRows - PullRequest
       29

Haskell HDBC.Sqlite3 fetchAllRows

0 голосов
/ 29 августа 2018

Так как я абсолютный новичок на Хаскеле, но полон решимости победить, я снова прошу помощи.

с помощью:

fetchData2 = do
  conn <- connectSqlite3 "dBase.db"
  statement <- prepare conn "SELECT * FROM test WHERE id > 0"
  execute statement []
  results <- fetchAllRows statement
  print results

возвращается:

[[SqlInt64 3,SqlByteString "Newco"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"],[SqlInt64 4,SqlByteString "Oldco"],[SqlInt64 5,SqlByteString "Mycom"]]

Есть ли умный способ очистки этих данных в Int и [Char], другими словами, пропуская типы SqlInt64 и SqlByteString.

1 Ответ

0 голосов
/ 29 августа 2018

Вы можете определить помощника:

fetchRowFromSql :: Convertible SqlValue a => Statement -> IO (Maybe [a])
fetchRowFromSql = fmap (fmap (fmap fromSql)) . fetchRow

Реализация выглядит немного устрашающе, но это только потому, что нам нужно углубиться в слоистые функторы, как вы уже заметили (сначала IO, затем Maybe и, наконец, []). Это возвращает что-то, что можно конвертировать из SqlValue. Есть несколько из них уже определены. Смотрите, например документы . Пример (с использованием -XTypeApplications):

fetchRowFromSql @String :: Statement -> IO (Maybe [String])

Возможно, мне следует добавить, что в документации упоминается, что fromSql небезопасен. Это означает, что если вы попытаетесь преобразовать значение sql в несовместимое значение Haskell, программа остановится.

...