pgrow czyli jak inaczej wyswietlić wiersz w psql

2009-02-15 od romanb hacks, pgrow, postgresql, psql

psql każdy używający postgresa znać powinien, wygodna konsola do bazy postgresql mająca masę możliwości. Niestety nie znalazłem rozwiązania jak poradzić sobie z sytuacją w której na wąskim terminalu wyświetlić trzeba wiersz tabeli mającej kilkanaście kolumn.

Próbowaliście? wygląda to m/w tak:

select * from klienci where id like '586_';
  id  | typ | kod  | s_kat |    imie    |     nazw     |                        nazwa_f
                        |      adr_ul      | adr_nr | adr_miasto | adr_kodp |   telefon
    |    tel_kom    |      nip      |          email          |
                   uwagi
------+-----+------+-------+------------+--------------+-------------------------------
------------------------+------------------+--------+------------+----------+----------
----+---------------+---------------+-------------------------+------------------------
-------------------------------------------------------------------
 5863 | i   | 7340 | now   | xxxxx      | xxxxxxxxxxxx |
                        |                  |        |            |          |          

    | xxxxxxxxx     |               |                         |
 5865 | i   | 7343 | now   | xxxxxxx    | xxxxx        | xxxxxxxxxx xxxxxxxxxxx xxxxxxx
 xxxxxxxxxxx x xxxxxxxx | ul. xxxx xxxxxxx | 6      | Kraków     | 31-547   | xxxxxxx
    | xxx xx xx fax | xxx-xx-xx-xxx | xxxxxxxxxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxxxxxxxxx
 lub ogólny sekretariat....;
Prawda, że piękne? Tylko szukaj tu człowieku danych...

Dlatego też, zainspirowany postem Huberta Lubaczewskiego, napisałem sobie skrypt którym pragnę się podzielić, powoduje on, że wynik tego samego zapytania wygląda tak:

--------------------
         id: 5863
        typ: i
        kod: 7340
      s_kat: now
       imie: xxxxx
       nazw: xxxxxxxxxxxx
    nazwa_f:
     adr_ul:
     adr_nr:
 adr_miasto:
   adr_kodp:
    telefon:
    tel_kom: xxxxxxxxx
        nip:
      email:
      uwagi:
--------------------
         id: 5865
        typ: i
        kod: 7343
      s_kat: now
       imie: xxxxxxx
       nazw: xxxxx
    nazwa_f: xxxxxxxxxx xxxxxxxxxxx xxxxxxx xxxxxxxxxxx x xxxxxxxx
     adr_ul: ul. xxxx xxxxxxx
     adr_nr: 6
 adr_miasto: Kraków
   adr_kodp: 31-547
    telefon: xxxxxxx
    tel_kom: xxx xx xx fax
        nip: xxx-xx-xx-xxx
      email: xxxxxxxxxxxxxxxxxxxxxxx
      uwagi: xxxxxxxxxxxxxxxxxxxxxxx lub ogólny sekretariat....;
--------------------
Według mnie lepiej, a Wy jak myślicie?

Oto skrypt:

#!/usr/bin/perl
my $head = 0;
my $continue = 0;
while (<STDIN>) {
        if (/^\(\d+ row/) {
                print "-"x20 . "\n" . $_;
                $head = 0;
                $continue = 0;
                @data = undef;
                @data2 = undef;
                next;
        }
        s/[\n\r]+$//;
        if (!$head) {
                @order = split /\|/;
                $head = 1;

                foreach $t (@order) {
                        $head = length($t) if length($t) > $head;
                }
                $head++;
                next;
        }
        if ($continue) {
                @data2 = split /\|/;
                $data[$#data] .= '\n' . (shift @data2);
                push @data, @data2;
        } else {
                @data = split /\|/, $_, -1;
        }
        if ($#data < $#order) {
                $continue = 1;
                next;
        } else {
                $continue = 0;
        }

        printf("%s\n", "-"x20);
        for $i (0..$#order) {
                printf("%${head}s: %s\n", $order[$i], $data[$i]);
        }
}
Tak go należy użyć w psql:
-- włączenie unaligned output (\a) oraz przekierowania output (\o):
\a \o |./pgrow.pl
-- select
select * from;
-- wyłączenie unaligned oraz przekierowania output:
\a \o
Miłego używania...