首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sqlalchemy等待行更新或行插入

使用sqlalchemy等待行更新或行插入
EN

Stack Overflow用户
提问于 2014-06-18 12:25:35
回答 2查看 5.9K关注 0票数 13

我有一个应用程序,显示数据库的内容,每5-10分钟更新一次。在数据库中加载所有数据大约需要5分钟。我不希望每次刷新时都重新加载数据库中的所有数据,而是只加载已更新的新行或行字段。

  1. 是否可以使用sqlalchemy检查已更改或新的字段(以轮询更改)?
  2. 是否可以使用sqlalchemy (使用阻塞函数调用)等待更改或新的字段?

数据库是postgres数据库,如果这很重要的话。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-19 06:33:52

ProstgeSQL具有通知/侦听机制,可与触发器一起使用该机制发送插入、删除和更新通知。通知包括一个参数,如表和操作。

看起来SQLAlchemy不支持这个功能,可能是因为它不是SQL标准,而是特定于Postgres的。

下面是使用python:PostgreSQL听/通知检查prostgres数据库中是否发生更改的示例,其中使用了通知/侦听

NOTIFY in PostgreSQL and python上搜索可能会提供更多帮助。

票数 7
EN

Stack Overflow用户

发布于 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()来查看是否有通知。

代码语言:javascript
复制
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秒超时,但有时候这个超时非常方便,可以同时检查其他一些内容。

一个这样的用例是,当您使用通知告诉您正在更新的表时。你把超时时间设为相当长的时间。如果收到通知或超时,则执行选择,以查看表中发生了哪些更改。那样的话,如果你收到通知的话,你就会马上去做,但最终还是会做的,即使你没有。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24285563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档