Epsql (experimental psql)

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání

epsql

epsql (experimental psql) je čistě privátní záležitost. SQL konzole psql musí za všech okolností a všech prostředích pracovat bez chyb. Je to první aplikace, prostřednictvím ní uživatel získá první dojem o PostgreSQL. Tudíž jsou core vývojáři poměrně hodně nedůtkliví ohledně požadavků na přidávání nových funkcí. Je to hodně konzervativní aplikace - podobně jako Oraclovské sqlplus. Tudíž jsem udělal vlastní fork. Pár dní jsem si hrál a psql upravil tak, že používá UTF rámečky a ANSI escape kódy pro zvýraznění záhlaví tabulek (a kromě toho, to rozumně zalamuje (v mezerách)). epsql jsem je tzv postcardware, takže jestli se Vám epsql líbí, pošlete pohlednici na adresu uvedenou v README.

Rozšířená podpora stylů

K dispozici jsou 4 styly rámečků a 7 stylů vykreslení. Je možné nastavit escape sekvenci (barvy a zvýraznění) pro řádek se záhlavím sloupců a pro jednotlivá záhlaví.

postgres=# \pset borderlinestyle 0
Border line style is 0.
postgres=# \pset border 2
Border style is 2.
postgres=# \l
                                   List of databases
+-----------+----------+----------+-------------+-------------+-----------------------+
| Name      | Owner    | Encoding | Collation   | Ctype       | Access privileges     |
+-----------+----------+----------+-------------+-------------+-----------------------+
| postgres  | postgres | UTF8     | cs_CZ.UTF-8 | cs_CZ.UTF-8 |                       |
| template0 | postgres | UTF8     | cs_CZ.UTF-8 | cs_CZ.UTF-8 | =c/postgres           |
|                                                             : postgres=CTc/postgres |
| template1 | postgres | UTF8     | cs_CZ.UTF-8 | cs_CZ.UTF-8 | =c/postgres           |
|                                                             : postgres=CTc/postgres |
+-----------+----------+----------+-------------+-------------+-----------------------+
(3 rows)

postgres=# \pset borderlinestyle 1
Border line style is 1.
postgres=# \pset border 3
Border style is 3.
postgres=# \l
                                   List of databases
┌───────────┬──────────┬──────────┬─────────────┬─────────────┬───────────────────────┐
│ Name      │ Owner    │ Encoding │ Collation   │ Ctype       │ Access privileges     │
├───────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────┤
│ postgres  │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │                       │
├───────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────┤
│ template0 │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │ =c/postgres           │
│           ┊          ┊          ┊             ┊             : postgres=CTc/postgres │
├───────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────┤
│ template1 │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │ =c/postgres           │
│           ┊          ┊          ┊             ┊             : postgres=CTc/postgres │
└───────────┴──────────┴──────────┴─────────────┴─────────────┴───────────────────────┘
(3 rows)

postgres=# \pset border 2
Border style is 2.
postgres=# \pset borderlinestyle 3
Border line style is 3.
postgres=# \l
                                   List of databases
╔═══════════╤══════════╤══════════╤═════════════╤═════════════╤═══════════════════════╗
║ Name      │ Owner    │ Encoding │ Collation   │ Ctype       │ Access privileges     ║
╟───────────┼──────────┼──────────┼─────────────┼─────────────┼───────────────────────╢
║ postgres  │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │                       ║
║ template0 │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │ =c/postgres           ║
║           ┊          ┊          ┊             ┊             : postgres=CTc/postgres ║
║ template1 │ postgres │ UTF8     │ cs_CZ.UTF-8 │ cs_CZ.UTF-8 │ =c/postgres           ║
║           ┊          ┊          ┊             ┊             : postgres=CTc/postgres ║
╚═══════════╧══════════╧══════════╧═════════════╧═════════════╧═══════════════════════╝
(3 rows)

Číslování řádků výpisu zdrojového kódu funkce

Funkce, která mi hodně chyběla je listing funkce s číslováním řádků. Proto je v epsql. Metapříkaz \lf má odlehčenou variantu - se symbolem mínus. V případě použití odlehčené varianty se nečíslují řádky výpisu.

postgres=# select test(10);
ERROR:  division by zero
CONTEXT:  PL/pgSQL function "test" line 3 at assignment

postgres=# \lf test
***	CREATE OR REPLACE FUNCTION public.test(a integer)
***	 RETURNS integer
***	 LANGUAGE plpgsql
***	AS $function$
  1	declare b int; 
  2	begin
  3	  b := a/0;
  4	  return a;
  5	end;
***	$function$

Integrace kurzorů

V psql se docela nepohodlně přenášejí data z databáze k dalšímu zpracování. Co umí psql dobře, je zobrazení výsledku dotazu. Pro cokoliv ostatního je skoro jednodušší si napsat uloženou proceduru nebo skript v bashi. Pokusem o vyřešení omezenosti psql je integrace podpory kurzorů - metapříkazy \fetch a \fetchall. Metapříkaz fetch přečte záznam z kurzoru a jeho obsah uloží do psql proměnných. S obsahem těchto proměnných pak můžeme dále pracovat:

postgres=# BEGIN;
BEGIN
postgres=# DECLARE c CURSOR FOR SELECT * FROM pg_database;
DECLARE CURSOR
postgres=# \fetch c \echo :datname :datcollate
template1 cs_CZ.UTF-8
postgres=# \fetch c \echo :datname :datcollate
template0 cs_CZ.UTF-8
postgres=# \fetch c \echo :datname :datcollate
postgres cs_CZ.UTF-8
postgres=# \fetch c \echo :datname :datcollate
ERROR:  (not available)
postgres=# COMMIT;
COMMIT

Metapříkaz \fetchall provede totéž co příkaz fetch a navíc pro každý záznam všechny příkazy v psql bloku - tj. na jednom řádku:

postgres=# CREATE TABLE test1(a int); CREATE TABLE test2(a int);
CREATE TABLE
CREATE TABLE
postgres=# BEGIN;
BEGIN
postgres=# DECLARE c CURSOR FOR SELECT tablename FROM pg_tables WHERE tablename LIKE 'test%';
DECLARE CURSOR
postgres=# \fetchall c DROP TABLE :tablename; 
DROP TABLE
DROP TABLE
postgres=# COMMIT;
COMMIT
postgres=#