SQLAlchemy 不直接支持 Postgres LISTEN/NOTIFY,但您可以通过 psycopg2 获得它,然后它会为您提供这种功能:http://initd.org/psycopg/docs/advanced.html#async-notify
(我从这个要点得到这个:https://gist.github.com/dtheodor/3862093af36a1aeb8104)
Psycopg2 可以进行完全异步的通知传递。我个人在 SQLAlchemy 中对此并没有太多运气,我怀疑这对于他们来说有点太低了,无法支持。但是,文档在下面复制了一个示例,该示例使用 select() 等待连接说正在发生的事情,然后在其上使用 poll() 来查看是否有通知。
import select
import psycopg2
import psycopg2.extensions
conn = psycopg2.connect(DSN)
conn.set_isolation_level(psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT)
curs = conn.cursor()
curs.execute("LISTEN test;")
print "Waiting for notifications on channel 'test'"
while 1:
if select.select([conn],[],[],5) == ([],[],[]):
print "Timeout"
else:
conn.poll()
while conn.notifies:
notify = conn.notifies.pop(0)
print "Got NOTIFY:", notify.pid, notify.channel, notify.payload
此示例有一个可选的 5 秒超时,但有时该超时非常方便同时检查其他内容。
一个这样的用例是当您使用 NOTIFY 来告诉您正在更新的表时。您将超时设置为相当长的时间。如果您收到 NOTIFY 或超时,请执行 SELECT 以查看表中的更改。这样一来,如果您收到 NOTIFY,您会立即执行此操作,但即使您没有收到,最终也会执行此操作。