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。每次改变价值都应该运行 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

你提出的有严重的性能问题。(想象一下有人批量插入 1000 行——它会创建 1000 的 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.

高级说明:这将正常工作,直到您需要每秒处理许多作业,或者在不每秒轮询数据库 100 次的情况下减少延迟。在这种情况下,您不应该使用 SQL 数据库。使用真正的队列,如 AMPQ、Redis/Resque、Celery 等。客户端将行插入 SQL,然后也将作业扔到作业队列中。您可以让许多工作人员并行处理作业。

于 2013-07-06T20:08:56.150 回答