我们可以从sqlite3执行操作系统命令吗?

时间:2011-05-22 14:12:19

标签: shell unix sqlite

我的要求是: 在将新条目添加到表中时运行shell脚本。

有没有办法在插入新行时添加触发器来运行shell脚本?


嗯,情况是:

我正在使用不同程序的数据库。 假设程序X创建并填充xyz.db,我只需要在程序X将新行插入表中时执行一个小脚本。

目前我的shell脚本在循环中无限运行并检查是否有新行并对其进行处理,因为插入不是很频繁,连续运行脚本不是一个好选择。

我的问题类似于can we execute unix command from oracle10g procedure,但我需要在sqlite3

中做同样的事情

2 个答案:

答案 0 :(得分:4)

首先,我完全赞同这些评论,这听起来像是一个糟糕的架构。如果shell脚本操作不是独立于与数据库交互的程序,则应通过调用某种系统命令,在程序使用的驱动程序中或作为主代码的一部分,将此调用嵌入到代码中。

在Java中,可以使用ruby中的ProcessBuilder类,system(<command>)方法和python中的os.system(<command>)来完成。

在oracle中,可以在java中编写可用于进行系统调用的触发器,但sqlite中不存在此功能。

如果完全有必要,我建议在sqlite db驱动程序周围编写一个包装器并在那里进行系统调用。

也许您可以扩展您实际需要做的事情,我们可以提供替代方法

更新

您可以使用c / c ++ sqlite界面在c / c ++中创建一个回调函数(请参阅http://www.sqlite.org/capi3ref.html中的数据更改通知回调),您可以在触发器中调用该函数

CREATE TRIGGER <trigger name>
    INSERT ON <table_name>
    BEGIN
        SELECT callback_function()
    END;

然后你可以使用这个callback_function调用你的shell脚本,听起来相对复杂,但非常有趣。

答案 1 :(得分:1)

我只是想确定你问的是正确的问题......

正如你所说

  

检查是否有新行并处理它,...(不经常)...连续运行脚本不是一个好选择。

所以你现在有类似

的东西
while true ; do
   $scriptPath/sqlCheckForNewValues.sh
    sleep ${sleepSecs:-60}
done

(如果你没有睡觉,那么同意,这不是最佳的,并且注意睡眠值可以在检查时间调整以超过用户期望(所以可能300秒就足够了。

虽然我在校长中同意对这种架构的反对意见,但只有你知道真正的优先事项(这需要更多关于你想要完成的事情的背景信息)。

根据您的描述,当您的整个系统处理时间不超过.001%时,您将花费大量时间来计算和解决此问题的解决方案。

这是一件好事吗,或者你能真正量化这是否值得及时支出?难道你没有其他功能,这次会更好用吗?

IHTH