我有一个应用程序,显示数据库的内容,每5-10分钟更新一次。在数据库中加载所有数据大约需要5分钟。我不希望每次刷新时都重新加载数据库中的所有数据,而是只加载已更新的新行或行字段。
数据库是postgres数据库,如果这很重要的话。
发布于 2014-06-19 06:33:52
ProstgeSQL具有通知/侦听机制,可与触发器一起使用该机制发送插入、删除和更新通知。通知包括一个参数,如表和操作。
看起来SQLAlchemy不支持这个功能,可能是因为它不是SQL标准,而是特定于Postgres的。
下面是使用python:PostgreSQL听/通知检查prostgres数据库中是否发生更改的示例,其中使用了通知/侦听
在NOTIFY in PostgreSQL and python上搜索可能会提供更多帮助。
发布于 2018-11-03 21:15:57
SQLAlchemy不直接支持Postgres侦听/通知,但是您可以通过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秒超时,但有时候这个超时非常方便,可以同时检查其他一些内容。
一个这样的用例是,当您使用通知告诉您正在更新的表时。你把超时时间设为相当长的时间。如果收到通知或超时,则执行选择,以查看表中发生了哪些更改。那样的话,如果你收到通知的话,你就会马上去做,但最终还是会做的,即使你没有。
https://stackoverflow.com/questions/24285563
复制相似问题