Haskell, HDBC.Sqlite3 - Как добавить столбец, если он еще не существует? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть функция, которая при 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" в текущую строку

Но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 21 декабря 2018

Я смог решить проблему.

Первое использование describeTable функция из пакета HDBC.Функция будет возвращать имена столбцов и их тип.Если вам просто нужны имена, как я, это то, что вы можете сделать

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