web-dev-qa-db-ja.com

リモートsqliteコマンドを実行する

これをDBA交換に移動する必要がある場合は、お詫び申し上げます。私にはDBよりもLinuxのように感じます。

スケジュールされたcronジョブを毎晩実行し、出力をメールで送信するマシンがいくつかあります。私はこのようなもののための電子メールを望んでいません。一般的に私たちが電子メールを使用する方法は壊れていると思いますが、それは別の話です。

そのため、ジョブがいつ開始し、いつ終了したか、さらには出力までの情報を格納する中央SQLiteデータベースを保持できると考え始めました。次に、それを照会するWebページを作成して、昨夜起こっていたことを知らせます。

簡単なスキーマを思いついたので、スクリプトの冒頭でこのコマンドを実行できます。

sqlite3 dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"

これで、私の仕事がいつ始まったのかを記録しました。やったー次に、同様のコマンドを実行して、ジョブが終了する時間を設定できます。

そう。データベースとタスクが同じマシン上にある場合、これはうまく機能します。別のマシンに行って、sqliteデータベースを更新する必要があります。どうすれば効率的にそれを行うことができますか?

私はこれを試しました

ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'"'

しかし、それは戻ります:

Error: no such column: NOW

いくつかのバリエーションを試しましたが、どこにも行きませんでした。

私は近いですか?まったく違うことをすべきでしょうか?ホイールを再発明していますか?

8
LVLAaron

それはすべて引用から来ています。これを試してください:

ssh [email protected] 'sqlite3 /home/aaron/dbname.db "UPDATE data SET \
LastStart = DATETIME('''NOW''') WHERE TaskName = '''taskname'''"'

ps。 NOWを引用する必要があります。そうしないと、sqliteはそのような名前の列を見つけようとします。しかし、あなたの引用'は、sshからの引用によって食べられます。エスケープできない'、したがって3つの引用符'''が使用されます(最初のsshの引用、2番目にsqliteに渡す必要のある引用、最後の1つは再びsshの引用を開きます)。

pps。さらに、次のように引用符を逆にすることができます。

ssh [email protected] "sqlite3 /home/aaron/dbname.db \"UPDATE data SET \
LastStart = DATETIME('NOW') WHERE TaskName = 'taskname'\""
10
rush