4

/usr/esercizi/ の私の python は次のとおりです。

#!/usr/bin/python
import datetime
now = datetime.datetime.now()
aa = now.strftime("%Y-%d-%m %H:%M | %S")

out_file = open("/usr/esercizi/test.txt","w")
out_file.write("La data di oggi \n\n")
out_file.write(aa)
out_file.close()

テスト目的で作成され、トリガーから呼び出されるのが好きです。

mysql> CREATE TRIGGER `notifica_cambiamenti` AFTER UPDATE ON `valore`
    -> FOR EACH ROW BEGIN
    ->
    -> SET @exec_var = sys_exec(CONCAT('python /usr/esercizi/tre.py ', NEW.valore));
    -> END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

テーブルには id と valore の 2 つの列しかありません。変更するたびに、valore は tre.py を実行する必要があります

私も与えます:

chown mysql:mysql tre.py | および chmod 777 tre.py

Query OK は、構文エラーがないことを示しているようですが、ファイルには何も起こりません: test.txt

私は何を間違っていますか?

4

2 に答える 2

1

あなたの問題は解決しました。私があなたの問題に対して行った次のことを行ってください...

CREATE TABLE log_table( datetime update_time, varchar() valore);

更新された値がトリガーによって保存される上記のテーブルを作成しました。

さて、トリガーを次のように定義しました..

  DELIMITER ;;

  CREATE TRIGGER `notifica_cambiamenti` AFTER UPDATE ON `valore`

  FOR EACH ROW

     BEGIN

       INSERT INTO log_table

          SET update_time = NOW(),
              valore      = NEW.valore);

   END;;
于 2013-11-27T11:24:02.387 に答える
0

あなたが提案しているものには、重大なパフォーマンス上の問題があります。(誰かが数千行の一括挿入を行うと想像してください。これは数千行の Python プロセスを作成し、すぐにサーバーをダウンさせます。) 問題のない、はるかに簡単な方法を次に示します: (警告: テストされていない疑似コード)

CREATE TABLE log_table( datetime update_time, varchar() valore);

CREATE TRIGGER `notifica_cambiamenti` AFTER UPDATE ON `valore`
-> FOR EACH ROW BEGIN
->
-> insert into log_table(now(), NEW.valore);
-> END;
-> $$

これで、ログ テーブルを定期的に処理し、確認した行を削除する非同期ジョブ (または cron ジョブ) を作成できます DELETE FROM log_table WHERE update_time < $LAST_ROW_SEEN

高度な注意: これは、1 秒間に多くのジョブを処理する必要があるか、1 秒間に何百回もデータベースをポーリングせずに待ち時間を短縮する必要があるまでは問題なく機能します。その場合、SQL データベースを使用しないでください。AMPQ、Redis/Resque、Celery などの実際のキューを使用します。クライアントは行を SQL に挿入し、ジョブをジョブ キューに投入します。多くのワーカーがジョブを並行して処理できます。

于 2013-07-06T20:08:56.150 に答える