Строго отправляя несколько SQL-операторов в SQLite за одну транзакцию из Haskell HDBC

Мои навыки в Haskell находятся в зачаточном состоянии, и монады меня озадачивают.

Однако мне нужно построить функцию, которая будет устанавливать все приборы в базе данных sqlite3.

module UmeQuery where

import Database.HDBC 
import Database.HDBC.Sqlite3

testdb = "testdata/ume.umedb"

runSetup dbFile = do
    conn <- connectSqlite3 dbFile
    res <- withTransaction conn ( setup conn )
    disconnect conn
    return $ res

setup conn = do 
    n1 <- setupUtterances conn
    n2 <- setupLevels conn
    return $ [n1, n2] 


setupUtterances conn = do 
    q1 <- quickQuery' conn "DROP TABLE IF EXISTS utterances;" []
    q2 <- quickQuery' conn "CREATE TABLE utterances (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, filelength REAL, updated_at TEXT, checksum_algorithm TEXT, checksum TEXT, UNIQUE(name) ON CONFLICT FAIL );" []
    return $ [q1,q2] 

setupLevels conn = do 
    q1 <- quickQuery' conn "DROP TABLE IF EXISTS levels;"
    q2 <- quickQuery' conn "CREATE TABLE levels (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE ON CONFLICT FAIL );"
    return $ [q1,q2]

Когда я пытаюсь запустить это, я получаю следующий вывод:

UmeQuery.hs:16:15:
Couldn't match expected type `IO [[[SqlValue]]]'
            with actual type `[SqlValue] -> [IO [[SqlValue]]]'
In the return type of a call of `setupLevels'
Probable cause: `setupLevels' is applied to too few arguments
In a stmt of a 'do' block: n2 <- setupLevels conn
In the expression:
  do { n1 <- setupUtterances conn;
       n2 <- setupLevels conn;
       return $ [n1, n2] }

То, что я хотел бы получить, это просто то, что показывает, что все в порядке. Обратите внимание, что мне, похоже, нужна строгость, иначе операторы DROP TABLE не всегда превышаются перед созданием новой таблицы.

Кроме того, если я могу задать два вопроса одновременно: программа установки в конечном итоге настроит 12 таблиц аналогичным образом. Есть ли способ, как я могу построить установку как fmap ($ conn) над списком, содержащим вовлеченные функции в этом случае? Конечно, это сделало бы код намного приятнее.

1 ответ

Извините, да проблема заключалась в том, что я каррировал, не осознавая этого. Наверное, слишком поздно для кодирования.

import Database.HDBC 
import Database.HDBC.Sqlite3

testdb = "testdata/ume.umedb"

runSetup dbFile = do
    conn <- connectSqlite3 dbFile
    res <- withTransaction conn ( setup )
    disconnect conn
    return $ res

setup conn = do 
    n1 <- setupUtterances conn
    n2 <- setupLevels conn
    return $ n1 

setupUtterances conn = do 
    quickQuery' conn "DROP TABLE IF EXISTS utterances;" []
    quickQuery' conn "CREATE TABLE utterances (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, filelength REAL, updated_at TEXT, checksum_algorithm TEXT, checksum TEXT, UNIQUE(name) ON CONFLICT FAIL );" []
    return ()

setupLevels conn = do 
    quickQuery' conn "DROP TABLE IF EXISTS levels;" []
    quickQuery' conn "CREATE TABLE levels (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT UNIQUE ON CONFLICT FAIL );" []
    return ()

main = runSetup testdb

Это работает.

Другие вопросы по тегам