Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python mySQL触发器在控制台插入后工作,但在脚本插入后不工作_Python_Mysql_Sql_Triggers - Fatal编程技术网

Python mySQL触发器在控制台插入后工作,但在脚本插入后不工作

Python mySQL触发器在控制台插入后工作,但在脚本插入后不工作,python,mysql,sql,triggers,Python,Mysql,Sql,Triggers,我的扳机有问题 我设置了一个触发器,用于在表中插入后更新其他表 如果我从MySQL控制台进行插入,一切正常,但是如果我从外部python脚本进行插入,即使数据相同,触发器也不会执行任何操作,如下面所示 我尝试将定义符更改为“user”@“%”和“root”@“%”,但它仍然没有执行任何操作 mysql> select vid_visit,vid_money from videos where video_id=487; +-----------+-----------+ | vid_vis

我的扳机有问题

我设置了一个触发器,用于在表中插入后更新其他表

如果我从MySQL控制台进行插入,一切正常,但是如果我从外部python脚本进行插入,即使数据相同,触发器也不会执行任何操作,如下面所示

我尝试将定义符更改为“user”@“%”和“root”@“%”,但它仍然没有执行任何操作

mysql> select vid_visit,vid_money from videos where video_id=487;
+-----------+-----------+
| vid_visit | vid_money |
+-----------+-----------+
|        21 |     0.297 |
+-----------+-----------+
1 row in set (0,01 sec)

mysql> INSERT INTO `table`.`validEvents` ( `id` , `campaigns_id` , `video_id` , `date` , `producer_id` , `distributor_id` , `money_producer` , `money_distributor` , `type` ) VALUES ( NULL , '30', '487', '2010-05-20 01:20:00', '1', '0', '0.009', '0.000', 'PRE' );
Query OK, 1 row affected (0,00 sec)

mysql> select vid_visit,vid_money from videos where video_id=487;                                                                  

+-----------+-----------+
| vid_visit | vid_money |
+-----------+-----------+
|        22 |     0.306 |
+-----------+-----------+

DROP TRIGGER IF EXISTS `updateVisitAndMoney`//
CREATE TRIGGER `updateVisitAndMoney` BEFORE INSERT ON `validEvents`
 FOR EACH ROW BEGIN
    if (NEW.type = 'PRE') THEN
                SET @eventcash=NEW.money_producer + NEW.money_distributor;
        UPDATE campaigns SET cmp_visit_distributed = cmp_visit_distributed + 1 , cmp_money_distributed = cmp_money_distributed + NEW.money_producer + NEW.money_distributor WHERE idcampaigns = NEW.campaigns_id;
        UPDATE offer_producer SET ofp_visit_procesed = ofp_visit_procesed + 1 , ofp_money_procesed = ofp_money_procesed + NEW. money_producer WHERE ofp_video_id = NEW.video_id AND ofp_money_procesed = NEW. campaigns_id;
        UPDATE videos SET vid_visit = vid_visit + 1 , vid_money = vid_money + @eventcash WHERE video_id = NEW.video_id;

        if (NEW.distributor_id != '') then
            UPDATE agreements SET visit_procesed = visit_procesed + 1, money_producer = money_producer + NEW.money_producer, money_distributor = money_distributor + NEW.money_distributor WHERE id_campaigns = NEW. campaigns_id AND id_video = NEW.video_id AND ag_distributor_id = NEW.distributor_id;
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_distributor WHERE date = SYSDATE()  AND campaign_id = NEW. campaigns_id AND user_id = NEW.distributor_id;
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW.money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id= NEW.producer_id;
        ELSE
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id = NEW.producer_id;
        END IF;
    END IF;
END
//

我认为更可能的情况是您遇到了一个未捕获的错误,而不是触发器没有执行,特别是因为它从控制台成功执行

您需要隔离错误发生的位置—在触发器本身或调用脚本中

在python脚本中,打印python发送给MySQL执行的SQL语句,以确保它按照您的预期构造—例如,如果NEW.type不等于'PRE',触发器将已执行,但不会导致任何更新

还要确保您正在检查插入的错误。我不是一个python程序员,所以我不能告诉你如何做到这一点,但这似乎是你正在寻找的

如果这两个都没有导致问题,请注释掉整个
If(NEW.type='PRE'),然后执行一个简单的修改,例如将NEW.type设置为'debug'。在确保触发器确实执行之后,依次重新测试,并添加更多的实际代码,直到隔离问题


此外,Marcos评论说,如果脚本在成功完成后没有自动提交,我会感到惊讶。事实上,我会对任何脚本/语言做出这样的声明。

对于将来发现这个问题的人,我猜解决方案是将mysql autocommit设置为true。 打开连接查询后,请执行以下操作:


SET autocommit=1

Shell命令仅在控制台中运行,而不是在实际服务器上运行。您可以使用UDF或轮询来完成所需的任务

当按脚本插入时,是否“提交”?我在启用自动提交时遇到类似问题。不确定这里是否有人遇到此问题: