如何获取 MySQL 数据库更改的通知?

问题描述 投票:0回答:5

在 Python 中,有没有办法收到 MySQL 数据库中的特定表已更改的通知?

python mysql
5个回答
10
投票

理论上是可行的,但我不推荐它:

本质上,你在表上有一个触发器,它调用 UDF,它以某种方式与你的 Python 应用程序进行通信。

陷阱包括如果出现错误会发生什么?

如果阻塞了怎么办? 理想情况下,触发器内发生的任何事情都应该是近乎即时的。

如果它位于回滚的事务中怎么办?

我确信还有很多其他问题我还没有想到。

如果可能的话,更好的方法是让数据访问层通知应用程序的其余部分。 如果您正在寻找您无法控制的程序何时修改数据库,那么您可能会运气不佳。

另一种不太理想但比从触发器内调用另一个程序更好的方法是设置某种“LastModified”表,该表由带有触发器的触发器更新。 然后在您的应用程序中检查该日期时间是否大于您上次检查的时间。


5
投票

如果更改是指如果一行已被更新、删除或插入,那么有一个解决方法。

您可以在MySQL中创建触发器

DELIMITER $$

CREATE TRIGGER ai_tablename_each AFTER INSERT ON tablename FOR EACH ROW
BEGIN
  DECLARE exec_result integer;

  SET exec_result = sys_exec(CONCAT('my_cmd '
                                    ,'insert on table tablename '
                                    ,',id=',new.id));
  IF exec_result = 0 THEN BEGIN
    INSERT INTO table_external_result (id, tablename, result) 
      VALUES (null, 'tablename', 0)
  END; END IF;
END$$

DELIMITER ;

这将调用服务器上的可执行脚本

my_cmd
。 (有关更多信息,请参阅 sys_exec)以及一些参数。

my_cmd 可以是 Python 程序,也可以是您可以使用 MySQL 使用的用户帐户从命令行执行的任何程序。

您必须为您希望程序收到通知的每个更改(

INSERT
/
UPDATE
/
DELETE
)以及每个表创建一个触发器。
此外,您还需要找到某种方法将正在运行的 Python 程序链接到您通过
sys_exec()
调用的命令行实用程序。

不推荐
不推荐这种行为,因为它可能会:

  1. 减慢 MySQL 速度;
  2. 如果 my_cmd 没有返回,则使其挂起/超时;
  3. 如果您正在使用交易,您将在交易结束前收到通知;
  4. 我不确定如果交易回滚,您是否会收到
  5. delete
     的通知;  
  6. 这个设计太丑了

链接 sys_exec:
http://www.mysqludf.org/lib_mysqludf_sys/index.php


3
投票
是的,可能不是 SQL 标准。但 PostgreSQL 从版本 9.x 开始就通过 LISTEN 和 NOTIFY 支持这一点

http://www.postgresql.org/docs/9.0/static/sql-notify.html


0
投票
标准 SQL 功能不可能实现。


-1
投票
尝试使用网络监视器而不是 MySQL 触发器可能不是一个坏主意。像这样扩展网络监视器:

http://sourceforge.net/projects/pynetmontool/

然后编写一个脚本,等待端口 3306(或 MySQL 服务器侦听的任何端口)上的活动,然后在网络活动满足某些过滤条件时检查数据库。

这是一个非常高水平的想法,您需要进一步研究,但您不会遇到数据库触发器问题,并且您不必编写每秒运行的 cron 作业。

© www.soinside.com 2019 - 2024. All rights reserved.