【问题标题】:Waiting for a row update or row insertion with sqlalchemy使用 sqlalchemy 等待行更新或行插入
【发布时间】:2014-08-08 17:59:39
【问题描述】:

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

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

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

【问题讨论】:

    标签: python postgresql sqlalchemy


    【解决方案1】:

    ProstgeSQL 有一个 NOTIFY / LISTEN 机制,可以与触发器一起使用来发送插入、删除和更新的通知。通知包含一个参数,例如表格和操作。

    SQLAlchemy 似乎不支持此功能,可能是因为它不是 SQL 标准,而是 Postgres 特定的。

    这是一个使用 Python 使用 NOTIFY / LISTEN 检查 prostgres 数据库中更改的示例:PostgreSQL LISTEN/NOTIFY

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

    【讨论】:

      【解决方案2】:

      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,您会立即执行此操作,但即使您没有收到,最终也会执行此操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-14
        • 2014-05-03
        • 2018-05-17
        • 2012-07-02
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 2014-02-08
        相关资源
        最近更新 更多