如何在 Common Lisp 中使用 Postmodern 获得表更改时的通知?

问题描述 投票:0回答:1

预先感谢您的帮助!

我想设置一个 Lisp 程序,在我的 Postgres 数据库表更新时执行某些操作。我正在使用令人惊叹的后现代图书馆,这绝对是太棒了。

正如这个问题中所讨论的(Common Lisp with Postmodern package中的表更改的客户端通知)我不想轮询数据库(因为OP抱怨答案),而是希望数据库告诉我的程序何时做某事。

回答者指向后现代功能“等待通知”:https://github.com/marijnh/Postmodern/blob/22aab0ec25d5f6affd390e690827a7515aeafd4f/cl-postgres/public.lisp#L358-L370

我有点担心这个函数,因为 1. 它是后现代的内部函数,因此(如果我错了,请告诉我)不供公众使用,2. 它以“数据库连接”作为参数,我对此无法追踪。

所以:

  1. 任何人都可以为我指明正确的方向,以正确理解和使用“数据库连接”吗?
  2. 告诉我,我在这里找错了方向,如果是这样,请为我指明正确的方向,以学习如何让我的 Lisp 程序在我的表发生变化时执行某些操作?

非常感谢!

postgresql common-lisp sbcl
1个回答
0
投票
  1. 它是后现代内部的,因此(如果我错了请告诉我)不适合公众消费

有不同的层,

wait-for-notification
是从
cl-postgres
包导出的符号,并在名为
public.lisp
的文件中定义,所以直接使用它应该可以。后现代处于更高的抽象级别,但根据您的需要,您可以直接调用
cl-postgre
函数。

  1. 它以“数据库连接”作为参数,我无法找到它。

当您拨打

open-database
时就会得到连接。像
with-connection
这样的辅助宏绑定特殊的
*database*
变量。通常,这由
query
和其他命令无形地使用,这些命令查看
*database*
的当前绑定。但是,如果您想更多地了解它的使用方式,https://marijnhaverbeke.nl/postmodern/cl-postgres.html 的文档似乎相当不错。

备注

如果您要等待表中的更改,您很可能需要使用专用线程。文档说:

如果您的应用程序是线程化的,则每个线程应使用自己的连接。连接是有状态的,尝试对多个线程使用相同的连接可能会出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.