我有一个函数,给定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数据库文件中。我为此使用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"
值但是我不确定该怎么做。
答案 0 :(得分:0)
我能够解决问题。
首先使用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 []