Python 正在使用sqlalchemy等待行更新或行插入

Python 正在使用sqlalchemy等待行更新或行插入,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个应用程序,它显示每5-10分钟更新一次的数据库内容。加载数据库中的所有数据大约需要5分钟。与每次刷新时重新加载数据库中的所有数据不同,我只想加载已更新的新行或行字段 是否可以使用sqlalchemy检查更改的或新的字段(以轮询更改) 是否可以使用sqlalchemy(通过阻塞函数调用)等待更改的或新的字段 该数据库是一个postgres数据库,如果需要的话。ProsgesQL有一个机制NOTIFY/LISTEN,可与触发器一起使用,以发送插入、删除和更新通知。通知包括一个参数,如表和操作

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

  • 是否可以使用sqlalchemy检查更改的或新的字段(以轮询更改)
  • 是否可以使用sqlalchemy(通过阻塞函数调用)等待更改的或新的字段

  • 该数据库是一个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告诉您一个表正在更新时。您将超时设置为相当长的时间。如果收到通知或超时,请执行选择以查看表中的更改。这样,如果你收到通知,你会马上做,但即使你没有,最终也会做