在数据库事件上运行Python脚本

9 投票
3 回答
25968 浏览
提问于 2025-04-18 04:51

我正在运行一个Python脚本,它会对一个特定的数据库进行修改。
我想在我的数据库(本地服务器)发生修改时,运行第二个脚本。

有没有什么办法可以做到这一点?

非常感谢任何帮助!
谢谢!

3 个回答

0

如果你想让Python脚本一直运行,并且监听某个表的变化,可以按照以下步骤操作:

  1. 首先,在你的数据库里创建一个监听表,比如叫'触发表',里面只放一个值。

  2. 然后,创建一个触发器,每当某个表发生变化时,就会更新'触发表'里的值。

  3. 最后,写一个Python脚本,定期检查这个表的值是否发生变化(每隔n秒检查一次,具体时间根据你需要更新的速度来定)。因为这个表只有一个值,并且你有良好的网络连接(如果数据库在线的话),所以一切应该运行得很快。当值发生变化时,执行一个函数。

创建MySQL触发器的教程可以参考这个链接: https://www.mysqltutorial.org/create-the-first-trigger-in-mysql.aspx

下面是SQL代码(顺便说一下,我用的是MS SQL,但你应该能理解如何设置):

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER dbo.new 
   ON  dbo.rc 
   AFTER INSERT,DELETE,UPDATE
AS 

--Declare the variable and set the value from the change_table
DECLARE @PurchaseName AS CHAR(1)
SELECT @PurchaseName = _check
FROM dev.dbo.change_table
WHERE _check_1 IS NOT NULL

IF @PurchaseName = 'Y'
BEGIN
  -- If the condition is TRUE then execute the following statement
  UPDATE dev.dbo.change_table SET _check = 'N' WHERE _check_1 IS NOT NULL
END
ELSE
BEGIN
   -- If the condition is False then execute the following statement
    UPDATE dev.dbo.change_table SET _check = 'Y' WHERE _check_1 IS NOT NULL
END
GO

change_table只有两列和一行,具体情况可以看下面的图片。

change_table的图片

这是Python代码:

import pyodbc
import pandas as pd

# Connect to SQL Server
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=<YOUR SERVER>;DATABASE=<YOUR DATABASE>;UID=<YOUR USER ID>;PWD=<YOUR PASSWORD>')
previous_value = ""
while True:
    current_value = str(pd.read_sql_query('SELECT _check FROM change_table',cnxn)['_check'].tolist()[0])
    if current_value != previous_value:
        prev_value = current_value
        #Write your code here

上面的SQL代码会在'rc'表每次插入、更新或删除时,改变change_table里的值。而Python代码会每秒检查8次这个值,看看是否有变化。顺便提一下,这个8次每秒是在100MB/s的光纤网络下进行的,服务器在地球的另一边,所以...应该能满足需求。

3

在你的数据库中,你可以使用“存储过程”。很多关系型数据库管理系统(RDBMS)都支持一种或多种编程语言来实现这一点。根据我所知道的,PostgreSQL也支持信号来调用外部程序。你可以在网上搜索一些类似“PostgreSQL中用Python编写存储过程”或者“PostgreSQL触发器调用外部程序”的内容。

13

谢谢大家的回答,我在这里找到了一个解决方案:

http://crazytechthoughts.blogspot.fr/2011/12/call-external-program-from-mysql.html

需要定义一个触发器,这样在数据库表被修改时就可以调用外部函数:

DELIMITER $
CREATE TRIGGER Test_Trigger
AFTER INSERT ON SFCRoutingTable
FOR EACH ROW
BEGIN
DECLARE cmd CHAR(255);
DECLARE result int(10);
SET cmd = CONCAT('python /home/triggers.py');
SET result = sys_exec(cmd);
END;
$
DELIMITER ;

在这里,为了调用我的Python脚本,我使用了'sys_exec',这是一个用户定义的函数(UDF)。你可以从这里下载这个库:https://github.com/mysqludf/lib_mysqludf_sys

撰写回答