Thanks.  I'm aware of all of those other alternatives, but the thing is,
I'm not trying to answer this broader question:

*"What are some options for capturing change events in PostgreSQL?"*

Rather, I'm trying to answer a narrower question:

*"How does one capture output from pg_recvlogical and pipe it back into the
database with psql?"*

Best,
David

On Sat, Jan 13, 2024 at 10:29 AM Adrian Klaver <adrian.kla...@aklaver.com>
wrote:

> On 1/12/24 21:23, David Ventimiglia wrote:
> > Let me just lay my cards on the table.  What I'm really trying to do is
> > capture change events with logical decoding and then send them back into
> > the database into a database table.  To do that, I believe I need to
> > process the event records into SQL insert statements somehow.  xargs is
> > one option.  jq is another.  My idea was to pipe the pg_recvlogical
> > output through a jq transform into psql, but that didn't work (neither
> > did earlier experiments with xargs).  Redirecting the output to an
> > intermediate file via stdout was just an attempt to reduce the problem
> > to a simpler problem.  I had /thought/ (incorrectly, as it turns out)
> > that I was unable even to redirect it to a file, but evidently that's
> > not the case.  I can redirect it to a file.  What I cannot seem to do is
> > run it through a jq filter and pipe it back into psql.  I can run it
> > through a jq filter and redirect it to a file, no problem.  But the
> > minute I change it to pipe to psql, it ceases to produce the desired
> result.
> >
> > I tried illustrating this in this screencast:
> >
> > https://asciinema.org/a/npzgcTN8DDjUdkaZlVyYJhZ5y
> > <https://asciinema.org/a/npzgcTN8DDjUdkaZlVyYJhZ5y>
> >
> > Perhaps another way to put this is, how /does/ one capture output from
> > pg_recvlogical and pipe it back into the database (or if you like, some
> > other database) with psql.  When I set out to do this I didn't think
> > bash pipes and redirection would be the hard part, and yet here I am.
> > Maybe there's some other way, because I'm fresh out of ideas.
>
> This is going to depend a lot on what you define as a change event. Is
> that DDL changes or data changes or both?
>
> Some existing solutions that cover the above to a one degree or another:
>
> Event triggers:
>
> https://www.postgresql.org/docs/current/event-triggers.html
>
> PGAudit
>
> https://github.com/pgaudit/pgaudit/blob/master/README.md
>
> Or since you are part of the way there already just using logical
> replication entirely:
>
> https://www.postgresql.org/docs/current/logical-replication.html
>
>
> >
> > Best,
> > David
> >
> > On Fri, Jan 12, 2024 at 8:42 PM Juan Rodrigo Alejandro Burgos Mella
> > <rodrigoburgosme...@gmail.com <mailto:rodrigoburgosme...@gmail.com>>
> wrote:
> >
> >
> >     try use the following syntax (yes, with a 2 before the greater sign)
> >
> >     pg_recvlogical -d postgres --slot test --start -f - 2>> sample.jsonl
> >
> >     Atte
> >     JRBM
> >
> >     El vie, 12 ene 2024 a las 16:35, David Ventimiglia
> >     (<davidaventimig...@hasura.io <mailto:davidaventimig...@hasura.io>>)
> >     escribió:
> >
> >         Hello! How do I redirect logical decoding output from the
> >         PostgreSQL CLI tool |pg_recvlogical| either to a file or to
> >         another command via a pipe? I ask because when I try the
> >         obvious, no output is recorded or sent:
> >
> >         |pg_recvlogical -d postgres --slot test --start -f - >>
> >         sample.jsonl |
> >
> >         Lest there be any confusion, I already created the slot in an
> >         earlier step. Moreover, I can verify that if I omit the output
> >         redirection |>> sample| then it does work, insofar as it emits
> >         the expected change events when I perform DML in another
> >         terminal window. When I include the redirection (or
> >         alternatively, set up a pipeline), then nothing happens.
> >
> >         Note that I am aware of the option to pass a filename to the -f
> >         switch to write to a file.  That works, but it's not what I'm
> >         after because it doesn't help update my mental model of how this
> >         is supposed to work.  Based on my current (flawed) mental model
> >         built up from command line experience with other tools, this
> >         /should/ work.  I should be able to send the output to stdout
> >         and then redirect it to a file.  It surprises me that I cannot.
> >
> >         Anyway, thanks!
> >
> >         Best,
> >
> >         David
> >
>
> --
> Adrian Klaver
> adrian.kla...@aklaver.com
>
>

Reply via email to