Haskell、HDBC.Sqlite3 - 如果列不存在,如何添加?
Haskell, HDBC.Sqlite3 - How to add a column if it doesn't exist already?
我有一个函数,它给出了一个 Int
returns 字符串列表。
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 and 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
函数。该函数将 return 列名称和类型。如果你像我一样只需要名字,这就是你可以做的
getColumnsInTable :: conn -> String -> IO [String]
getColumnsInTable conn tableName = do
d <- describeTable conn tableName
return $ fst <$> d
return 将包含所有列的名称。
浏览列表以查看它是否包含您想要的所有列。如果它不使用如下函数来更改 table,即添加一个具有 INT
类型的新列。
createNewColumn conn columnName = do
let stmt = "ALTER TABLE FantasyBooks ADD COLUMN " ++ columnName ++ " INT;"
run conn stmt []
我有一个函数,它给出了一个 Int
returns 字符串列表。
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 and 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
函数。该函数将 return 列名称和类型。如果你像我一样只需要名字,这就是你可以做的
getColumnsInTable :: conn -> String -> IO [String]
getColumnsInTable conn tableName = do
d <- describeTable conn tableName
return $ fst <$> d
return 将包含所有列的名称。
浏览列表以查看它是否包含您想要的所有列。如果它不使用如下函数来更改 table,即添加一个具有 INT
类型的新列。
createNewColumn conn columnName = do
let stmt = "ALTER TABLE FantasyBooks ADD COLUMN " ++ columnName ++ " INT;"
run conn stmt []