Как я могу игнорировать ошибки вставки sqlite3, чтобы позволить сценарию tcl продолжить после ошибки? - PullRequest
1 голос
/ 13 мая 2011

Понятно, что я пытаюсь сделать это следующим

set selectQuery "SELECT col1, col2 FROM tableName" 

db1 eval $selectQuery {
   set insertQuery "INSERT INTO tableName VALUES($col1, $col2)"
   db2 eval $insertQuery {
      # Do trivial stuff to show progress
   }
}

, который в основном копирует содержимое db1.tableName в db2.tableName.Проблема в том, что в моем случае большая часть содержимого db1.tableName уже существует в db2.tableName.В общем, я просто хочу скопировать то, чего еще не существует, поэтому я подумал, что просто вставлю все и позволю вставкам не работать, когда данные уже есть.Это не работает, потому что весь скрипт останавливается, как только одна вставка завершается неудачно.Я пытался использовать catch, чтобы игнорировать ошибку и позволить сценарию продолжить работу, но я не увенчался успехом.Любые идеи?

Кроме того, может быть лучший способ скопировать содержимое db1.tableName в db2.tableName без копирования того, что уже там ... Любая помощь будет оценена!

Шон

PS Если у вас есть идеи для лучшего заголовка, это также будет полезно ..

Ответы [ 2 ]

3 голосов
/ 13 мая 2011

Sqlite имеет конструкцию INSERT OR REPLACE INTO, которая может быть полезна в этом случае.

http://www.sqlite.org/lang_insert.html

1 голос
/ 13 мая 2011

Хотя я не знаком с вашими командами API базы данных, поэтому я не могу комментировать, как вы выполняете циклы в результатах запроса, но могу предложить несколько вещей.

Сначала попробуйте поймать снова.Я всегда нахожу использование немного странным, но в конце концов вы привыкаете к нему.Вот пример:

if { [catch { db2 eval $insertQuery} errmsg] } {
    #There was an error - it is stored in $errmsg"
} else {
    #success! Congratulations.
}

В вашем случае, я думаю, вы просто хотите игнорировать любые ошибки вставки, поэтому вы можете просто сделать:

set selectQuery "SELECT col1, col2 FROM tableName" 

db1 eval $selectQuery {
   set insertQuery "INSERT INTO tableName VALUES($col1, $col2)"
   if { ![catch { db2 eval $insertQuery} errmsg] } {
      # Do trivial stuff to show progress
   }
}

Вы также можете попробовать выполнить запроссначала и поместив результаты запроса в список TCL (или список списков) - затем выполните foreach в списке, выполняя вставки.Иногда базы данных могут смешно мутировать данные, хотя это не выглядит так, как в вашем случае.

...