Psql a Emacs: Porovnání verzí
Zacatek editace odstavce o Emacsu a SQL pro pokrocile |
mBez shrnutí editace |
||
(Není zobrazeno 32 mezilehlých verzí od 2 dalších uživatelů.) | |||
Řádek 1: | Řádek 1: | ||
== Psql == | == Psql == | ||
Psql je | Psql je interaktivní terminál pro přístup k databázovému systému [[PostgreSQL]]. | ||
psql [ volby... ] [ jméno_db [ uživatel ] ] | psql [ volby... ] [ jméno_db [ uživatel ] ] | ||
Řádek 7: | Řádek 7: | ||
Za normálních okolností vypisuje <tt>psql</tt> jako prompt jméno připojené databáze následované řetězcem =>. Například | Za normálních okolností vypisuje <tt>psql</tt> jako prompt jméno připojené databáze následované řetězcem =>. Například | ||
<pre> | |||
$ 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=> | |||
</pre> | |||
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 <tt>psql</tt> === | === Některé administrativní příkazy <tt>psql</tt> === | ||
Řádek 53: | Řádek 65: | ||
:Zobrazí nápovědu escape příkazů. | :Zobrazí nápovědu escape příkazů. | ||
== | <tt>\pset null '(null)'</tt> | ||
:Nastaví explicitní zobrazovaní hodnoty <tt>null</tt> na zadaný řetězec | |||
<tt>\copy</tt> | |||
: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 <tt>\copy</tt> provádí SQL příkaz COPY pro vstupní, resp. výstupní datový proud. | |||
<pre> | |||
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 [, ...] ] | |||
</pre> | |||
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 [http://en.wikipedia.org/wiki/Comma-separated_values CSV] anebo exportovat data do formátu ''csv.'' | |||
==== Příklad ==== | |||
Data ze souboru <code>bg.csv</code> můžeme do tabulky pokus z klienta <code>psql</code> 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 | |||
<pre> | |||
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 " | |||
=== Emacs - Rychlý přehled === | ... atd ... | ||
</pre> | |||
== [[GNU Emacs|Emacs]] == | |||
[[Image:emacs_sql.png|center|thumb|640px|Emacs a psql]] | |||
=== [[GNU Emacs|Emacs]] - Rychlý přehled === | |||
# M-x sql-postgres | # M-x sql-postgres | ||
Řádek 64: | Řádek 135: | ||
(Emacs sql-mode obdobně nabízí i připojení k databázovým systémům db2, informix, oracle, sybase, ingres, interbase a mysql). | (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í | 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 <tt>psql</tt> ve druhém okně. | ||
<tt>C-c C-c sql-send-paragraph</tt> | <tt>C-c C-c sql-send-paragraph</tt> | ||
Řádek 78: | Řádek 149: | ||
:nápověda | :nápověda | ||
=== [[GNU Emacs|Emacs]] - Podrobný popis === | |||
=== Emacs - Podrobný popis === | |||
==== Připojení k databázi ==== | ==== Připojení k databázi ==== | ||
Po spuštění <tt>emacs</tt> | Po spuštění <tt>emacs</tt> 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''. | se zobrazuje interakce s (na pozadí spuštěným procesem) ''psql''. | ||
M-x sql-postgres | M-x sql-postgres | ||
Po spuštění této funkce je | 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: | ||
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 | (setq sql-postgres-options '("-Uhonza" "-P")) ;; hodlam se prihlasit jakou uzivatel honza s heslem | ||
Řádek 115: | Řádek 184: | ||
==== Otevření sql souboru ==== | ==== Otevření sql souboru ==== | ||
Pro práci s databází | Pro práci s databází [[PostgreSQL]] z prostředí systému [[GNU Emacs|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 | 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, ...). | opakovaně již zadané dotazy. Praktické je zakládání souborů dle jednotlivých cvičení (cviceni1.sql, cviceni2.sql, ...). | ||
Řádek 135: | Řádek 204: | ||
<tt>C-c C-r sql-send-region</tt> | <tt>C-c C-r sql-send-region</tt> | ||
:provede všechny příkazy z daného bloku (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 <tt>M-x sql-mode</tt>. | |||
==== Barevné znázornění syntaxe ==== | ==== Barevné znázornění syntaxe ==== | ||
Řádek 143: | Řádek 218: | ||
(global-font-lock-mode t) ;; chci mit vsechny mody se znazornenou barevnou syntaxi | (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 | (add-hook 'sql-mode-hook '(lambda () (font-lock-mode 1))) ;; pouze pro sql mod | ||
=== Některé další užitečné příkazy Emacsu === | === Některé další užitečné příkazy [[GNU Emacs|Emacsu]] === | ||
<tt>M-x font-lock-mode</tt> | <tt>M-x font-lock-mode</tt> | ||
Řádek 155: | Řádek 229: | ||
<tt>M-l</tt> | <tt>M-l</tt> | ||
:převede následující slovo na malá písmena | :převede následující slovo na malá písmena | ||
<tt>C-x r m</tt> | |||
:nastaví bookmark na aktuální pozici otevřeného souboru | |||
<tt>C-x r b</tt> | |||
:skok na příslušný bookmark (''ouško'') | |||
<tt>C-x r l</tt> | |||
:výpis bookmarků | |||
<tt>M-x bookmark-save</tt> | |||
: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 == | == Podívejte se také na == | ||
* [[Databázové systémy]] | |||
* [[Instalace a správa PostgreSQL]] | * [[Instalace a správa PostgreSQL]] | ||
* [[GNU Emacs]] | |||
* [[Kate]] | |||
* [[Gedit]] | |||
{{Databáze}} | |||
Aktuální verze z 24. 2. 2011, 09:04
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