在数据库事件上运行Python脚本
我正在运行一个Python脚本,它会对一个特定的数据库进行修改。
我想在我的数据库(本地服务器)发生修改时,运行第二个脚本。
有没有什么办法可以做到这一点?
非常感谢任何帮助!
谢谢!
3 个回答
如果你想让Python脚本一直运行,并且监听某个表的变化,可以按照以下步骤操作:
首先,在你的数据库里创建一个监听表,比如叫'触发表',里面只放一个值。
然后,创建一个触发器,每当某个表发生变化时,就会更新'触发表'里的值。
最后,写一个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只有两列和一行,具体情况可以看下面的图片。
这是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的光纤网络下进行的,服务器在地球的另一边,所以...应该能满足需求。
在你的数据库中,你可以使用“存储过程”。很多关系型数据库管理系统(RDBMS)都支持一种或多种编程语言来实现这一点。根据我所知道的,PostgreSQL也支持信号来调用外部程序。你可以在网上搜索一些类似“PostgreSQL中用Python编写存储过程”或者“PostgreSQL触发器调用外部程序”的内容。
谢谢大家的回答,我在这里找到了一个解决方案:
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