2

tail -fsqliteファイルのように動作するスクリプトを作成しようとしています。トリガーが最良の答えだと思って、私は次のことを試しました。

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

挿入時に、新しい行をstdoutに出力するという考え方です。残念ながら、テーブルに挿入しても何も得られませんでした。

私は何が間違っているのですか?

また、これをすべてsqliteシェルから機能させることができると仮定すると、他のプロセスがテーブルに挿入された場合でも機能しますか?

4

2 に答える 2

3

SQLite がSELECTコマンドを実行すると、データがアプリケーションに返されるだけです。sqlite3データに対して何らかの処理を行うのはアプリケーションの責任です (シェルの場合は出力するなど)。

トリガーの内部では、 の結果を待つアプリケーションがないSELECTため、結果は破棄されます。トリガー内のコマンドの唯一の目的は、SELECT何らかの副作用を持つユーザー定義関数を呼び出すことです。

理論的には、何かを印刷する独自のユーザー定義関数を定義できます。

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

ただし、他のプロセスを制御しない限り、その機能はインストールされません。

于 2013-02-02T10:52:11.970 に答える
1

ループで 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
于 2016-10-20T19:17:07.340 に答える