Psql a Emacs

Z GeoWikiCZ

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 a psql

Emacs - Rychlý přehled

  1. M-x sql-postgres
  2. Server:
  3. 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:

  1. 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ý)
  2. 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.
  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

Podívejte se také na