【问题标题】:sqlite trigger outputsqlite 触发输出
【发布时间】:2013-02-01 21:36:36
【问题描述】:

我正在尝试创建一个类似于tail -f 但用于sqlite 文件的脚本。 认为触发器是最好的答案,我尝试了以下方法:

CREATE TEMPORARY TRIGGER "tailf" AFTER INSERT ON "my_table"
  BEGIN
    SELECT * FROM "my_table" WHERE rowid = NEW.rowid;
  END;

这个想法是在插入时,它将新行打印到标准输出。 不幸的是,插入表格时,我什么也没得到。

我做错了什么?

另外,假设我可以通过 sqlite shell 让它工作,当其他进程插入到表中时它仍然工作吗?

【问题讨论】:

    标签: shell logging sqlite tail


    【解决方案1】:

    当 SQLite 执行 SELECT 命令时,它只是将数据返回给应用程序。 应用程序有责任对数据做一些事情(例如在sqlite3 shell 的情况下打印它)。

    在触发器内部,没有应用程序等待SELECT的结果,所以结果被丢弃了。 在触发器中使用SELECT 命令的目的是调用具有某些副作用的用户定义函数。

    理论上,您可以定义自己的用户定义函数来打印一些东西:

    CREATE TEMPORARY TRIGGER "tailf" AFTER INSERT ON "my_table"
    BEGIN
        SELECT print(column1, column2, ...) FROM "my_table" WHERE rowid = NEW.rowid;
    END;
    

    但除非您控制其他进程,否则它们不会为您安装该功能。

    【讨论】:

      【解决方案2】:

      您可以循环运行 sqlite。

      双反转

      while true; do sqlite3 /tmp/db.db 'select * from (select * from j1939 order by timestamp desc limit 50) order by timestamp asc limit 50'; sleep 1; done | grep -E
      

      简单监控

      $ while true; do sqlite3 /tmp/db.db 'select * from j1939 where id>(select max(id) from j1939)-50'; sleep 1; done
      
      1621524|LOGIN1|838
      1621525|LOGIN2|19
      1621526|LOGIN3|839
      1621527|LOGIN4|20
      1621528|LOGIN5|839 (more...)
      

      您可以过滤结果。

      while true; do sqlite3 /tmp/db.db 'select * from j1939 where id>(select max(id) from j1939)-50'; sleep 1; done | grep -E LOGIN5|LOGIN3
      
      1621526|LOGIN3|839
      1621528|LOGIN5|839
      

      你可以提取你需要的列

      while true; do sqlite3 /tmp/db.db 'select * from j1939 where id>(select max(id) from j1939)-50'; sleep 1; done | cut -d '|' -f 1-2
      
      1621526|LOGIN3|839
      1621528|LOGIN5|839
      

      可能的改进

      您也可以考虑将此添加到.bashrc, 所以你可以做类似的事情

      sqlitetailf /tmp/db.db j1939
      
      
      1621524|LOGIN1|838
      1621525|LOGIN2|19
      1621526|LOGIN3|839
      1621527|LOGIN4|20
      1621528|LOGIN5|839
      

      2 秒后

      1621524|LOGIN1|838
      1621525|LOGIN2|19
      1621526|LOGIN3|839
      1621527|LOGIN4|20
      1621528|LOGIN5|839
      1621527|LOGIN6|20
      1621528|LOGIN7|839
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        • 2011-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多