我在/ 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()
为测试目的而制作我喜欢从TRIGGER调用它:
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。 每次更改valore都应运行tre.py
我也给:
chown mysql:mysql tre.py |和chmod 777 tre.py
查询OK,似乎表明没有语法错误 但文件上的没有任何反应:test.txt
我做错了什么?
答案 0 :(得分: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;;
答案 1 :(得分: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,然后将作业放入作业队列。您可以让许多工作人员并行处理作业。