哈斯克尔,HDBC。Sqlite3 - 如果列尚不存在,如何添加列?



我的函数给定一个Int返回字符串列表。

fetchParts :: Int -> [[String]]

这就是输出的外观

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

输出的长度可能是可变的。只有100%的时间才能出现前3个列表。

列表的后面可以是

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

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

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

或字符串的其他组合。

我想将此输出添加到SQLITE3数据库文件中。我正在使用HDBC和HDBC.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"

但我不确定该怎么做。

我能够解决问题。

首先使用HDBC软件包的describeTable函数。该函数将返回列名和类型。如果您只需要像我一样的名字,这就是您可以做的

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 []

相关内容

  • 没有找到相关文章

最新更新