0

我有一个函数,它给出一个Int返回字符串列表的列表。

fetchParts :: Int -> [[String]]

这就是输出的样子

[["title", "some title"], ["rate", "2.4"], ["dist", "some string"], ["tr", "1"], ["td, "2"] ..]]

输出的长度可以是可变的。只有前 3 个列表可以 100% 出现。

列表的后半部分可以是

["a", "1"], ["b", "2"] ..

或者

["some", "1"], ["part", "2"], ["of", "3"] ..]

或者

["ex1", "a"], ["ex2", "b"], ..]

或其他一些字符串组合。

我想将此输出添加到 sqlite3 数据库文件中。我为此使用HDBCHDBC.Sqlite3

要将某些内容添加到数据库文件中,我正在运行这些函数

  initialConnection <- connectSqlite3 "src/parts.db"
  run initialConnection partsEntry []
  commit initialConnection
  disconnect initialConnection

partsEntry像这样的简单 SQL 字符串在哪里

partsEntry = "INSERT INTO PARTSDATA ( title, rate, dist, ...) VALUES ( "some title", "2.4", "some string", ...)

在哪里

( title, rate, dist, ...)来自head <$> fetchParts 1

("some title", "2.4", "some string" ...)来自last <$> fetchParts 1

问题是如果"some"列不存在,代码会抛出错误。

我想做的是这样的

  • 如果列"abc"不存在,则在当前行添加列"abc"并插入 值"this"
  • 如果列存在,只需在当前行"abc"插入值"this"

但我不知道该怎么做。

4

1 回答 1

0

我能够解决这个问题。

首次使用describeTableHDBC 包中的功能。该函数将返回列名和类型。如果你只需要像我一样的名字,这就是你可以做的

getColumnsInTable :: conn -> String -> IO [String]
getColumnsInTable conn tableName = do
  d <- describeTable conn tableName
  return $ fst <$> d

返回将包含所有列的名称。

扫描列表以查看它是否包含您想要的所有列。如果它不使用类似下面的函数来改变表,即添加一个具有INT类型的新列。

createNewColumn conn columnName = do
  let stmt = "ALTER TABLE FantasyBooks ADD COLUMN " ++ columnName ++ " INT;"
  run conn stmt []
于 2018-12-21T16:02:42.720 回答