Python 正在使用sqlalchemy等待行更新或行插入
我有一个应用程序,它显示每5-10分钟更新一次的数据库内容。加载数据库中的所有数据大约需要5分钟。与每次刷新时重新加载数据库中的所有数据不同,我只想加载已更新的新行或行字段Python 正在使用sqlalchemy等待行更新或行插入,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个应用程序,它显示每5-10分钟更新一次的数据库内容。加载数据库中的所有数据大约需要5分钟。与每次刷新时重新加载数据库中的所有数据不同,我只想加载已更新的新行或行字段 是否可以使用sqlalchemy检查更改的或新的字段(以轮询更改) 是否可以使用sqlalchemy(通过阻塞函数调用)等待更改的或新的字段 该数据库是一个postgres数据库,如果需要的话。ProsgesQL有一个机制NOTIFY/LISTEN,可与触发器一起使用,以发送插入、删除和更新通知。通知包括一个参数,如表和操作
该数据库是一个postgres数据库,如果需要的话。ProsgesQL有一个机制NOTIFY/LISTEN,可与触发器一起使用,以发送插入、删除和更新通知。通知包括一个参数,如表和操作 SQLAlchemy似乎不支持此功能,可能是因为它不是SQL标准,而是特定于Postgres的 下面是一个使用python使用NOTIFY/LISTEN检查Prosgres数据库中更改的示例:
在PostgreSQL和python中搜索
NOTIFY可能会提供更多帮助。SQLAlchemy不直接支持Postgres侦听/通知,但您可以通过psycopg2获得它,它会为您提供以下功能:
(我是从这个要点得出这个结论的:)
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告诉您一个表正在更新时。您将超时设置为相当长的时间。如果收到通知或超时,请执行选择以查看表中的更改。这样,如果你收到通知,你会马上做,但即使你没有,最终也会做