2013-12-12 2 views
1

У меня есть таблица в базе данных haskell. Моя таблица «link_des» имеет два столбца. Я хочу одновременно просматривать оба столбца (только данные). Мой код:Как просмотреть данные из базы данных haskell

printURLs :: IO() 
printURLs = do urls <- getURLs 
      mapM_ print urls 

getURLs :: IO [String] 
getURLs = do conn <- connectSqlite3 "database.db" 
     res <- quickQuery' conn "SELECT * FROM link_des" [] 
     return $ map fromSql (map head res) 

С этим я получаю первые данные столбцов, как

[ "col_1_data_1", "col_1_data_2", ...]

с помощью 'последнего' в ВМЕСТО 'головы' я могу получить

[ "col_2_data_1", "col_2_data_2", ...]

Но я хочу, чтобы получить данные, такие как

[("col_1_data_1", "col_2_data_1"), ("col_1_data_2", "col_2_data_2"), ...]

который на самом деле, как рисунок [(row_1), (row_2), ...]

Может ли кто-нибудь мне помочь. Благодарю.

+2

Что вы пытались реализовать это самостоятельно? Похоже, вы хотите кортеж, можете ли вы использовать такую ​​функцию, как 'f [x, y] = (x, y)'? Будьте осторожны, если список слишком длинный или слишком короткий, вы можете получить ошибку, вам придется беспокоиться о том, как справиться с этим делом. – bheklilr

ответ

1

Если вы посмотрите на подпись типа quickQuery ', вы увидите, что он возвращает тип IO [[SqlValue]]. Это означает, что у вас уже есть данные в форме очень похожа на то, что вы хотите .... Вместо

[("col_1_data_1","col_2_data_1"),("col_1_data_2","col_2_data_2"), ...] 

у вас есть

[["col_1_data_1","col_2_data_1"],["col_1_data_2","col_2_data_2"], ...] 

Функция Вы писали просто вытащив первый столбец из этого используется «карта головы».

Вы всегда можете написать код для преобразования таблицы с известным числом столбцов и типов в соответствующие кортежи (с использованием функции типа "convert [first, second] = (fromSql first, fromSql second)"), но гораздо труднее написать что-то, что делает это для произвольных таблиц с различным количеством столбцов и типов. Это объясняется двумя причинами.

a. Во-первых, вам нужно превратить список в кортеж, что невозможно в Haskell для списков разного размера, если вы не используете расширения. Основная проблема заключается в том, что каждый размер кортежа является его собственным типом, а одна функция не может выбрать свой тип вывода на основе ввода. Вы можете сделать некоторые обманы, используя расширения GHC, но результат, вероятно, будет более сложным, чем вы, вероятно, захотите войти.

b. Во-вторых, вам нужно преобразовать каждое значение в результате из SqlValue в соответствующий тип Haskell. Это также трудно по тем же причинам.

Возможно, вы захотите рассмотреть другой подход. Посмотрите на постоянную библиотеку баз данных Yesod, которая описана в http://www.yesodweb.com/book/persistent. При этом вы определяете свою схему в квазивоке, и она создает записи Haskell, которые полностью безопасны по типу.

+1

«вам нужно превратить список в кортеж, что невозможно в Haskell, если вы не используете расширения». 'f [x, y] = Just (x, y); f_ = Ничего. Не нужно ни одного расширения для этого ... Но вы правильно говорите, что не можете написать одну функцию, чтобы превратить список в кортеж с эквивалентным размером для всех списков. Однако вы можете проверить свои данные, возвращенные из SQL-запроса, которые должны быть в структурированной форме и преобразовать их в ваш тип данных Haskell. То же самое происходит на любом другом языке при разговоре с БД, вы делаете запрос, проверяете данные и конвертируете в свой тип. – bheklilr

+1

@ bheklilr- Извините, моя формулировка была неаккуратной .... Я определенно хотел написать то, что вы сказали, конечно, вы можете написать эти функции как одну для определенной известной базы данных, но не в общем случае, если вы не используете расширения , Я уберу его выше. Настойчивость Yesod в основном предлагает способ автоматической записи конкретных функций для этого преобразования (но не для кортежа). – jamshidh

Смежные вопросы