python:如何获取mysql数据库更改的通知?

liv*_*m95 9 python mysql

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

Dav*_*vy8 8

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

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

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

如果阻止怎么办?理想情况下,触发器内发生的任何事情都应该接近即时.

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

我确信还有很多其他问题我也没有想过.

如果可能,更好的方法是让您的数据访问层通知您应用的其余部分.如果您正在寻找控制之外的程序修改数据库的时间,那么您可能会失败.

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


Joh*_*ica 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 ;
Run Code Online (Sandbox Code Playgroud)

my_cmd这将调用服务器上的可执行脚本。(有关更多信息,请参阅 sys_exec)以及一些参数。

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

您必须为您希望程序收到通知的每个更改 ( INSERT/ UPDATE/ ) 以及每个表创建一个触发器。 此外,您还需要找到某种方法将正在运行的 Python 程序链接到您通过.DELETE
sys_exec()

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

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

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


小智 1

标准 SQL 功能不可能实现。

  • 是的,尽管OP有专门标记为“mysql”而不是“sql” (3认同)