如何忽略sqlite3插入失败以允许tcl脚本在失败后继续?

时间:2011-05-13 13:50:32

标签: sqlite try-catch tcl

剥离,我试图做到以下

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而不复制已经存在的内容...任何帮助将不胜感激!

肖恩

如果你有更好的头衔的想法,这也是有用的..

2 个答案:

答案 0 :(得分:3)

Sqlite有一个INSERT OR REPLACE INTO结构,在这种情况下可能很有用。

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

答案 1 :(得分:1)

虽然我不熟悉你的数据库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,执行插入操作。有时数据库可能会对变异数据很有趣,尽管它看起来并不像你的情况那样。