剥离,我试图做到以下
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而不复制已经存在的内容...任何帮助将不胜感激!
肖恩
如果你有更好的头衔的想法,这也是有用的..
答案 0 :(得分:3)
Sqlite有一个INSERT OR REPLACE INTO结构,在这种情况下可能很有用。
答案 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,执行插入操作。有时数据库可能会对变异数据很有趣,尽管它看起来并不像你的情况那样。