Epsql (experimental psql)
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=#