在 Python 中,有没有办法收到 MySQL 数据库中的特定表已更改的通知?
理论上是可行的,但我不推荐它:
本质上,你在表上有一个触发器,它调用 UDF,它以某种方式与你的 Python 应用程序进行通信。
陷阱包括如果出现错误会发生什么?
如果阻塞了怎么办? 理想情况下,触发器内发生的任何事情都应该是近乎即时的。
如果它位于回滚的事务中怎么办?
我确信还有很多其他问题我还没有想到。
如果可能的话,更好的方法是让数据访问层通知应用程序的其余部分。 如果您正在寻找您无法控制的程序何时修改数据库,那么您可能会运气不佳。
另一种不太理想但比从触发器内调用另一个程序更好的方法是设置某种“LastModified”表,该表由带有触发器的触发器更新。 然后在您的应用程序中检查该日期时间是否大于您上次检查的时间。
如果更改是指如果一行已被更新、删除或插入,那么有一个解决方法。
您可以在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
)以及每个表创建一个触发器。sys_exec()
调用的命令行实用程序。
不推荐
不推荐这种行为,因为它可能会:
delete
的通知;
链接
sys_exec:
http://www.mysqludf.org/lib_mysqludf_sys/index.php