在tcl中使用sqlite绑定," eval"命令没有为" ATTACH DATABASE"

时间:2017-09-21 21:08:25

标签: linux sqlite tcl redhat

我正在尝试使用tcl自动执行数据库连接,因为它推荐用于sqlite

我试过" eval"用于CREATE TABLE,INSERT INTO和SELECT FROM。它们都按预期工作,但它没有与ATTACH DATABASE一起工作。 以下脚本没有做任何事情

#!/user/bin/tclsh
load /usr/lib/sqlite3.20.1/libsqlite3.20.1.so Sqlite3

sqlite3 main_db /location1/dbfile.sqlite
main_db eval { 
 ATTACH DATABASE "/home/location2/dbfile2.sqlite3" AS db; 
}

执行后我没有看到附加的数据库

谢谢!

2 个答案:

答案 0 :(得分:0)

我阅读SQLite文档意味着只需附加到数据库,您就可以通过在表名前添加附加的数据库名称来在同一会话中引用该数据库。我不认为"依恋"意味着对原始数据库文件的任何修改。因此,启动另一个进程来查看附加的效果并不会显示任何内容。也许还有其他方法可以解决你认为附加会解决的问题。

答案 1 :(得分:0)

它实际上按预期工作,我检查它的方式是错误的。

正如andy芒果所指出的,数据库附件的状态是每个会话,意思是:

在控制台上的location1 / dbfile上运行sqlite3是一个会话。 在location2 / dbfile2上运行tcl脚本是一个单独的会话。

ATTACH DATABASE在tcl会话上执行。我检查了控制台会话中的附件状态,但没有显示任何内容,因此看起来该脚本无效。

但它仍然有效,这就是我所做的:

#!/user/bin/tclsh
load /usr/lib/sqlite3.20.1/libsqlite3.20.1.so Sqlite3

sqlite3 main_db /location1/dbfile.sqlite
main_db eval { ATTACH DATABASE "/home/location2/dbfile2.sqlite3" AS db } 
main_db eval { INSERT INTO log VALUES(1, 'timetamp', 'event', 'remark')} # log is the table that already exists in location2/dbfile2
maindb close

我通过在控制台上为location2 / dbfile2打开一个会话来验证它是有效的,添加的数据就在那里。

想法是使用tcl脚本在location1 / dbfile上打开会话,然后将location2 / dbfile2附加到该会话,以便连接到location1 / dbfile的会话可以操作location2 / dbfile2。

目的是使用TRIGGER为location1 / dbfile建立审核试验,但日志需要位于不同的位置。