Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-如何对数据库插入/更新/删除做出反应?_R_Sqlite_R Dbi - Fatal编程技术网

R-如何对数据库插入/更新/删除做出反应?

R-如何对数据库插入/更新/删除做出反应?,r,sqlite,r-dbi,R,Sqlite,R Dbi,我正在用的将数据从SQLite数据库表读入data.frame。通常(每5秒一次),新记录会从外部添加到数据库表中,或更新/删除现有记录,此时我需要将这些更改传播到我的data.frame 所以问题是如何在R中连接并响应这些数据库事件?我不想为了确保没有任何变化而每隔5秒查询一次数据库。我可以使用一些回调机制吗?如果您可以访问编写SQL数据的C代码,那么您可以实现回调: http://www.sqlite.org/c3ref/update_hook.html 然后在回调函数中,如果要修改的表是

我正在用的将数据从SQLite数据库表读入
data.frame
。通常(每5秒一次),新记录会从外部添加到数据库表中,或更新/删除现有记录,此时我需要将这些更改传播到我的
data.frame


所以问题是如何在R中连接并响应这些数据库事件?我不想为了确保没有任何变化而每隔5秒查询一次数据库。我可以使用一些回调机制吗?

如果您可以访问编写SQL数据的C代码,那么您可以实现回调:

http://www.sqlite.org/c3ref/update_hook.html
然后在回调函数中,如果要修改的表是R代码关心的表,则可以更新文件的时间戳。然后,您的R代码检查该文件的时间戳,如果其发生更改,则只需要查询SQLite数据库

现在我不知道您是否可以向R持有的SQLite连接添加一个回调,并期望在另一个SQLite连接/进程更改数据库表时得到一个回调。我对此表示怀疑,我怀疑回调只有在它们注册的连接进行更新时才会触发,因为否则会发生各种异步事件,并且没有事件处理程序


另一个想法是使用触发器更新修改时间的数据库表。在您关心的所有表上定义触发器,以便它们更新“上次修改”表中的一行。然后使用文件修改时间检查对数据库的任何更改,然后您的R只需查询“上次修改”表,查看自上次检查以来哪些特定表发生了更改。

您可以使用
file.info(“myDB.sqlite”)保存上次修改的时间$mtime
并定期与当前修改时间进行比较。如果出现差异,就会触发一个新的查询,再次保存最近的修改日期以供进一步比较。@vaettchen,谢谢-我也这么认为,但这种方法对我的需要来说太粗糙了:我的数据库中有许多表,更新/插入/删除可以在所有表中随机进行。因此,任何一个表中的一个小更改都会触发数据库文件的“时间修改”标记的更改,并导致所有我的表都标记为需要重新读取—这太低效了。