Как написать executemany с двумя входами в haskell?

saveX :: [String] -> Int->IO ()
saveX [] y= return ()
sav xs y=
     do conn <- connectSqlite3 "cw.db"
        stmt <- prepare conn "INSERT INTO pic (src,urlId) VALUES (?,?)"
        executeMany stmt <what to add here>
        commit conn

У меня есть таблица с двумя столбцами src и urlId, и [String] содержит список src, а Int - это urlID. Я хочу вставить все таблицы в таблицу с URL-адресом. Я пробовал несколько способов преобразования кортежей, но toSql не работает для него. Пожалуйста, помогите мне с этим

1 ответ

Решение

В Real World Haskell есть почти идентичный пример:

ghci> conn <- connectSqlite3 "test1.db"
ghci> stmt <- prepare conn "INSERT INTO test VALUES (?, ?)"
ghci> executeMany stmt [[toSql 5, toSql "five's nice"], [toSql 6, SqlNull]]
ghci> commit conn
ghci> disconnect conn

редактировать

В вашем конкретном случае речь идет не о том, как использовать HDBC, а о том, как объединить один кусок обычных данных на Haskell, yсо списком данных, xs, map Функция принимает одну функцию и применяет ее к каждому элементу в списке, возвращая список результатов. Если мы поставим сингл y в функции мы можем map это на список, и получить результат для каждого элемента в списке. Например:

map (\x -> (x, "One Thing")) [1, 2, 3]

Приведет к:

[(1, "One Thing"), (2, "One Thing"), (3, "One Thing")]

Совместить свой y это URL с вашим xs которые содержат источники, вы могли бы написать

map (\x -> [toSql x, toSql y]) xs

Это даст вам следующий фрагмент кода:

saveX :: [String] -> Int->IO ()
saveX [] y= return ()
sav xs y=
     do conn <- connectSqlite3 "cw.db"
        stmt <- prepare conn "INSERT INTO pic (src,urlId) VALUES (?,?)"
        executeMany stmt (map (\x -> [toSql x, toSql y]) xs)
        commit conn
Другие вопросы по тегам