【问题标题】:How to receive automatic notifications about changes in tables?如何接收有关表格更改的自动通知?
【发布时间】:2014-01-15 10:24:03
【问题描述】:

我正在使用什么PostgreSQLPython我正在使用 Python 访问 PostgreSQL

我需要什么:如果有人在数据库的特定表上记录了某些内容,则在 Python 上接收自动通知。

我认为可以使用一个例程在某个时间间隔内转到该表并检查更改。但它需要一个循环,我想要一个异步方式之类的东西。

有可能吗?

【问题讨论】:

  • 您是在寻找因表中数据更改而导致的更新(即插入、更新、删除),还是因表结构的更改而导致的更新(即alter table)?
  • 插入更新删除。

标签: python postgresql events triggers listener


【解决方案1】:

donmage 非常正确 - LISTENNOTIFY 是您想要的。您仍然需要轮询循环,但它非常轻量级,不会导致可检测的服务器负载。

如果您希望psycopg2 在您的程序中随时触发回调,您可以通过生成一个线程并让该线程执行轮询循环来实现。检查 psycopg2 是否强制执行线程安全连接访问;如果没有,您需要自己进行锁定,以便轮询循环仅在连接空闲时运行,并且没有其他查询会中断轮询周期。或者,您可以只使用第二个连接进行事件轮询。

无论哪种方式,当轮询通知事件的后台线程收到通知时,它可以调用主程序提供的 Python 回调函数,这可能会修改程序其余部分共享的数据结构/变量。请注意,如果您这样做,它很快就会成为维护的噩梦。

如果您采用这种方法,我强烈建议您使用 multithreading / multiprocessing 模块。它们将大大简化您的生活,提供在线程之间交换数据的简单方法,并将侦听线程所做的修改限制在简单且控制良好的位置。

如果使用线程而不是进程,重要的是要理解在 cPython(即“普通 Python”)中你不能有真正的回调中断,因为在 cPython 中一次只能执行一个线程。阅读“全局解释器锁”(GIL)以了解更多相关信息。由于这个限制(以及默认情况下无共享并发更简单、更安全的特性),我通常更喜欢多处理而不是多线程。

【讨论】:

  • 谁是donmage?
【解决方案2】:

您要查找的命令可能是LISTEN/NOTIFY

如果您使用的是 psycopg,请查看 Asynchronous Notifications 部分。

[这确实需要轮询。]

【讨论】:

  • 虽然需要轮询,但它只是极其轻量级的轮询 - 您可以发送一个空命令,例如curs.execute(""), 连接。如果您不使用 SSL,实际上没有理由 psycopg2 无法检查套接字上的新可读数据并且根本不进行轮询,但它可能不支持。
【解决方案3】:

我相信你正在寻找的是一个触发器:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

【讨论】:

  • 不仅仅是一个触发器。对于 Python,我需要更多的东西,例如,当触发触发器时,我可以调用一个函数,但是 在 Python 内部
  • 你可以用你知道的python写触发器。不确定那是你需要的。但是触发器和通知/侦听设置似乎是您真正想要的。
猜你喜欢
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多