Re: Better way to process boolean query result in shell-like situations?

From: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
To: "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: Better way to process boolean query result in shell-like situations?
Date: 2015-10-29 02:59:15
Message-ID: CAKFQuwb_O73YP38ORwHXpaspeK=DprKEjbU1htoGtxv9XkKYOQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Oct 28, 2015 at 10:42 PM, Tim Landscheidt <tim(at)tim-landscheidt(dot)de>
wrote:

> Hi,
>
> I regularly run into the problem that I want to query a
> PostgreSQL database in a script/program and depending on a
> boolean result do one thing or the other. A typical example
> would be a Puppet Exec that creates a user only if it does
> not exist yet.
>
> But unfortunately psql always returns with the exit code 0
> if the query was run without errors.

​I don't consider this to be unfortunate...​

In a shell script I
> can use a query that returns an empty string for failure and
> something else for success and then test that à la:
>
> | if [ -n "$(psql -Atc "[…]") ]; then echo Success.; fi
>
> but for example in Puppet this requires putting around
> '/bin/bash -c "[…]"' with yet another level of quoting.
>

​Instead of saying "/bin/bash -c" can you not just say "psql -c"?​

> The best idea I had so far was to cause a runtime error
> (here with the logic reversed: If the user exists, psql re-
> turns failure, otherwise success):
>
>
​So write a function/script the encapsulates that logic and gives it a
friendly name...

| [tim(at)passepartout ~]$ psql -c "SELECT usename::INT FROM pg_user WHERE
> usename = 'tim';"; echo $?
> | FEHLER: ungültige Eingabesyntax für ganze Zahl: »tim«
> | 1
> | [tim(at)passepartout ~]$ psql -c "SELECT usename::INT FROM pg_user WHERE
> usename = 'does-not-exist';"; echo $?
> | usename
> | ---------
> | (0 rows)
>
> | 0
> | [tim(at)passepartout ~]$
>
> But this (in theory) could fail if usename could be con-
> verted to a number, and for example 'a'::INT will fail al-
> ways.
>
> Are there better ways?

​You never actually show any Puppet code that you are trying to write
better. That limits the audience that is going to be able to provide
help. If you provide a fully-working example of the code you have now
someone with general knowledge might be able to suggest a solution just
from looking at the code.

Ultimately I'd say the best solution is to write a script that performs the
desired logic and executes queries using psql as necessary but likely not
exposing the SQL to the using (i.e., Puppet) layer.

If you are looking for mechanics you do have the "--file" and
dollar-quoting capabilities to aid with nested quoting issues.

SELECT $$this is a valid query$$;

David J,

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Eelke Klein 2015-10-29 09:51:35 ftell mismatch with expected position
Previous Message Tim Landscheidt 2015-10-29 02:42:00 Better way to process boolean query result in shell-like situations?