Psql a Emacs
Psql
Psql je interaktivní terminál pro přístup k databázovému systému PostgreSQL.
psql [ volby... ] [ jméno_db [ uživatel ] ]
Za normálních okolností vypisuje psql jako prompt jméno připojené databáze následované řetězcem =>. Například
$ psql testdb Welcome to psql 8.3.7, the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help on internal slash commands \g or terminate with semicolon to execute query \q to quit testdb=>
Psql může načítat příkazy v dávkovém režimu ze standardního vstupu. Příkazy lze zadávavat klientovi psql také z příkazové řádky jako řetězce parametru -c (nebo --command). Například
psql sqlquiz -c "select count(pamatka) from unesco"
Výpis všech databázi
psql -l
nemusíte mít práva pro přístup ke všem z nich.
Některé administrativní příkazy psql
\cd [adresář]
- Změní běžný pracovní adresář na hodnotu zadaného argumentu. Bez argumentu změní pracovní adresář na uživatelův domovský adresář.
\connect (nebo \c) [jméno_db [uživatel]]
- Zajistí připojení k nové databázi anebo uživatelskému jménu.
\d [pattern]
- Pro každý vzor (pattern) zobrazí všechny odpovídající relace (tabulku, view, indexy, sekvence).
\dn [pattern]
- Zobrazí všechna dostupná schémata (prostory jmen - namespaces). Pokud je uveden vzor (regulární výraz), zobrazí pouze schémata odpovídající uvedenému vzoru (pattern).
\dt [pattern]
- Zobrazí všechny tabulky nebo tabulky odpovídající uvedenému vzoru.
\du [pattern]
- Zobrazí všechny databázové uživatele nebo uživatel odpovídající uvedenému vzoru.
\help (nebo \h) [příkaz]
- Zobrazí syntax uvedeného SQL příkazu. Není-li uveden, zobrazí všechny příkazy pro které je syntaktická nápověda k dispozici.
\i soubor
- Čte vstup ze zadaného souboru, stejně jako by byl zadáván z klávesnice.
\q
- Ukončí program psql.
\r
- Resetuje (vymaže) buffer dotazů.
\?
- Zobrazí nápovědu escape příkazů.
\pset null '(null)'
- Nastaví explicitní zobrazovaní hodnoty null na zadaný řetězec
\copy
- Kopírování dat ze vstupního proudu, resp. do výsputního proudu, viz následující odstavec
Příkaz \copy
Administrativní příkaz \copy provádí SQL příkaz COPY pro vstupní, resp. výstupní datový proud.
COPY tablename [ ( column [, ...] ) ] FROM { 'filename' | STDIN } [ [ WITH ] [ BINARY ] [ OIDS ] [ DELIMITER [ AS ] 'delimiter' ] [ NULL [ AS ] 'null string' ] [ CSV [ HEADER ] [ QUOTE [ AS ] 'quote' ] [ ESCAPE [ AS ] 'escape' ] [ FORCE NOT NULL column [, ...] ] COPY { tablename [ ( column [, ...] ) ] | ( query ) } TO { 'filename' | STDOUT } [ [ WITH ] [ BINARY ] [ OIDS ] [ DELIMITER [ AS ] 'delimiter' ] [ NULL [ AS ] 'null string' ] [ CSV [ HEADER ] [ QUOTE [ AS ] 'quote' ] [ ESCAPE [ AS ] 'escape' ] [ FORCE QUOTE column [, ...] ]
Příkaz COPY s pojmenovaným souborem může provádět pouze superuser, variantu s proudy STDIN a STDOUT může ovšem provádět každý uživatel s potřebnými právy k dané tabulce. Můžeme tedy velmi snadno importovat do databáze v datovém formátu CSV anebo exportovat data do formátu csv.
Příklad
Data ze souboru bg.csv
můžeme do tabulky pokus z klienta psql
importovat příkazem
\copy pokus FROM bg.csv CSV QUOTE '"'
Alternativně můžeme SQL příkaz COPY doplnit jako první řádek soboru CSV a přesměrovat jako vstup do psql
COPY pokus FROM STDIN CSV QUOTE '"'; "G",,1,"101MA1G","+",3,3,8,"z,zk",,"Matematika 1G" "G",,1,"101AZNM",,2,0,2,"z",,"Algoritmy a zákl. numerické matematiky" "G",,1,"104YC1x","+",0,2,2,"z",,"Cizí jazyk 1" "G",,1,"151GD1",,3,3,6,"kz",,"Geodézie 1" "G",,1,"152APOT","*",2,1,4,"z,zk",,"Aplikovaná optika " ... atd ...
Emacs
Emacs - Rychlý přehled
- M-x sql-postgres
- Server:
- Database:
... dále stejně/obdobně jako v psql, pouze nefunguje doplňování pomocí klávesy tab (Emacs sql-mode obdobně nabízí i připojení k databázovým systémům db2, informix, oracle, sybase, ingres, interbase a mysql).
Jestliže nyní otevřeme soubor s příponou sql (resp. je-li dané okno v sql-modu), pak můžeme zapsané sql příkazy posílat ke zpracování klientovi psql ve druhém okně.
C-c C-c sql-send-paragraph
- spustí příkazy běžného odstavce (odstavce jsou odděleny alespoň jedním prázdnám řádkem)
C-c C-r sql-send-region
- provede všechny příkazy z daného bloku (sql-send-region)
C-c C-b sql-send-buffer
- provede všechny příkazy z celého bufferu
C-c C-h
- nápověda
Emacs - Podrobný popis
Připojení k databázi
Po spuštění emacs je nutné připojit se k databázi. Příkaz sql-postgres se přípojí k databázi a vytvoří buffer s názvem *SQL* ve kterém se zobrazuje interakce s (na pozadí spuštěným procesem) psql.
M-x sql-postgres
Po spuštění této funkce je uživatel vyzván k vyplnění údajů o serveru a názvu databáze. Pro připojení ke cvičné školní databázi osdl se vyplní pouze název databáze. Jestliže se chceme připojit k databázi pod jiným uživatelem než který spustil instanci emacsu (např. pokud jsem přihlášen na serveru jako uživatel pytel, sql-postgres automaticky předpokládá že se budu k databázi hlásit jakou databázový uživatel pytel). Toto lze změnit nastavením parametrů při spuštění procesu psql z emacsu. Do souboru ~/.emacs je nutno dopsat:
(setq sql-postgres-options '("-Uhonza" "-P")) ;; hodlam se prihlasit jakou uzivatel honza s heslem
Nyní bude sql-postgres předpokládat že se hodláme hlásit jako uživatel honza s použitím hesla. Existují další proměnné které nám urychlují připojení k databázi přes sql-postgres:
(setq sql-server "localhost") ;; prihlasuji se nejcasteji k localhostu (setq sql-database "test") ;; pouzivam databazi test
Výše uvedená nastavení se nám defaultně zobrazí při připojování k databázi, tato nastavení můžeme explicitně měnit.
Po spuštění sql-postgres se nám otevře buffer v kterém můžeme pracovat stejně jako v SQL monitoru psql. Klávesou RET
(v Emacsovské terminologii klávesa Enter) odešleme příkaz. Důležité klávesové zkratky:
RET comint-send-input
- odeslání vstupu
C-up, C-c C-p comint-previous-input
- listování v historii směrem dozadu
C-down, C-c c-n comint-next-input
- listování v historii směrem dopředu
Otevření sql souboru
Pro práci s databází PostgreSQL z prostředí systému Emacsu je však lépe komunikovat přes soubor který si po otevření *SQL* bufferu otevřeme. Soubor může mít libovolné jméno a příponu .sql (např. hodina4.sql). Tento soubor můžeme např. průběžně ukládat, procházet obsah souboru a spouštět opakovaně již zadané dotazy. Praktické je zakládání souborů dle jednotlivých cvičení (cviceni1.sql, cviceni2.sql, ...).
Pokud hodláme odesílat dotazy pro databázi přes sql soubor je ideální si otevřít v Emacsu dvě okna. První okno bude obsahovat *SQL* buffer a druhé okno daný sql soubor. Pokud máme v okně pouze *SQL* buffer, je zde několik možností jak otevřít sql soubor:
- Okno rozdělíme na dvě horizontální okna klávesovou zkratkou C-x 2 a v jednom z oken (mezi okny se přechází klávesovou zkratkou C-x o) a následně otevřeme soubor klávesovou zkratkou C-x C-f (pokud soubor neexistuje, je vytvořen nový)
- Pokud hodláme rozdělit okna vertikálně (což se mi zdá velmi výhodné), použijeme stejný postup jako v bodě jedna, pouze pro rozdělení oken použijeme klávesovou zkratku C-x 3.
- Rozdělení okna a otevření souboru provedeme v jednom kroku pomocí klávesové zkratky C-x 4 C-f.
V nově otevřeném souboru můžeme psát SQL příkazy a odesílat je do *SQL* bufferu pomocí klávesových zkratek:
C-c C-c sql-send-paragraph
- spustí příkazy běžného odstavce (odstavce jsou odděleny alespoň jedním prázdnám řádkem)
C-c C-b sql-send-buffer
- provede všechny příkazy z celého bufferu
C-c C-r sql-send-region
- provede všechny příkazy z daného bloku (sql-send-region)
Výstupní SQL buffer lze resetovat odesláním příkazu \r.
Poznámka
- Pokud nejprve otevřete sql soubor a teprve pak se připojíte k databází příkazem sql-postgres, nebudou výše uvedené příkazy fungovat. Musíte proto explicitně pro daný buffer nastavit SQL mód příkazem M-x sql-mode.
Barevné znázornění syntaxe
Barevné znázornění syntaxe pro SQL příkazy otevřeného sql souboru lze provést příkazem font-lock-mode: M-x font-lock-mode. Pokud barevné znázornění syntaxe chceme mít implicitně zapnuté musíme do souboru .emacs zapsat jednu z následujících řádek
(global-font-lock-mode t) ;; chci mit vsechny mody se znazornenou barevnou syntaxi (add-hook 'sql-mode-hook '(lambda () (font-lock-mode 1))) ;; pouze pro sql mod
Některé další užitečné příkazy Emacsu
M-x font-lock-mode
- barevné zvýraznění syntaxe
M-u
- převede následující slovo na velká písmena
M-l
- převede následující slovo na malá písmena
C-x r m
- nastaví bookmark na aktuální pozici otevřeného souboru
C-x r b
- skok na příslušný bookmark (ouško)
C-x r l
- výpis bookmarků
M-x bookmark-save
- uloží bookmarky do souboru (implicitně ~/.emacs.bmk)
Problémy
WARNING: terminal is not fully functional
Řešení:
export PAGER=cat