Moje odkazy
Obsah článku:
vydáno: 6. 4. 2014 21:36, aktualizováno: 7. 9. 2014 18:58
Původně jsem chtěl vydat až verzi 1.0, ale jednak se od minula nastřádalo pár změn a jednak se mi nechtělo do některých věcí naplánovaných do 1.0, takže tu máme ještě verzi 0.9. Pokud nevíte, o čem je řeč, píšu dávkového/terminálového klienta pro relační databáze.
Přidal jsem volbu --sql-in
, která umožňuje načítání SQL příkazů ze STDIN, takže jde teď SQL-DK dobře používat v rouře nebo brát SQL příkazy ze souboru. Už není potřeba používat hack:
$ sql-dk … --sql "`cat soubor.sql`"
což mohl být jednak problém u delších skriptů a jednak nám pak SQL příkazy prosakují do výpisu procesů (to není z hlediska bezpečnosti zrovna žádoucí). Teď tedy stačí napsat něco jako:
$ cat soubor.sql | sql-dk … --sql-in # nebo:
$ sql-dk … --sql-in < soubor.sql
Případně bez roury a napsat SQL ručně (např. když databázovému uživateli nastavujete heslo a nechcete, aby bylo někde v historii nebo ve výpisu procesů).
XML formátovač výstupu teď podporuje (i vícerozměrná) pole:
<?xml version="1.0" encoding="UTF-8"?>
<batchResult xmlns="https://sql-dk.globalcode.info/xmlns/batchResult">
<database name="blog">
<statement>
<sql>SELECT array[array[1,2,3],array[4,5,6]]</sql>
<resultSet>
<columnHeader
label="array" name="array"
typeName="_int4" type="2003"/>
<row>
<column>
<array>
<item>
<array>
<item>1</item>
<item>2</item>
<item>3</item>
</array>
</item>
<item>
<array>
<item>4</item>
<item>5</item>
<item>6</item>
</array>
</item>
</array>
</column>
</row>
</resultSet>
</statement>
</database>
</batchResult>
Tabulkový formátovač nyní nahrazuje uvnitř hodnot tabulátory a nedělitelné mezery obarvenými symboly, takže to jednak nerozbíjí výslednou tabulku a jednak lépe vidíme, co máme v databázi uloženo.
SQL-DK umí vypisovat svoji konfiguraci (databázová spojení, formátovače…) stejně jako by to byla data z databáze (vypisují se pomocí formátovače a můžete si tedy zvolit výstup do libovolného formátu).
Volba --list-formatters
nově testuje, zda lze jednotlivé formátovače instanciovat (sloupeček valid
). Mj. tím ověříte, že nemáte v názvu třídy překlep.
Nová volba --list-jdbc-drivers
slouží k výpisu JDBC ovladačů dostupných na CLASSPATH. SQL-DK najde ovladače pomocí META-INF/services
.
Nová volba --list-jdbc-properties
vypíše konfigurovatelné a nakonfigurované vlastnosti dané databáze. JDBC ovladače totiž deklarují podporované volby, takže uživatel má k dispozici strojově čitelnou a vždy aktuální dokumentaci. Tyto properties lze nastavit u jednotlivých spojení v config.xml
nebo na příkazové řádce (--db-property
)
SQL-DK je univerzální klient a lze ho použít s libovolnou databází, ke které máte JDBC ovladač.
Napsal jsem i speciální loopback ovladač, který není skutečným ovladačem, nevyžaduje žádnou databázi a dokonce ani nepodporuje SQL. Je to prostě jen loopback, který vezme parametry dotazu a vrátí je jako výsledkovou sadu (samotný dotaz ignoruje).
Prvním parametrem je počet sloupců, pak následuje záhlaví a potom samotná data. Např. pro parametry:
2 a b x y z
vrátí výsledkovou sadu:
a | b ----- x | y z | null
Dá se to použít jednak pro testování (ano, pořádné automatizované testy jsou jedna z těch věcí, která má přijít do verze 1.0), při kterém nejsme závislí na skutečné běžící databázi, ale výsledky dotazů si nasimulujeme. A jednak se to dá použít na různé ad-hoc pokusy a hrátky.
Např. si vypíšeme soubor /etc/fstab
hezky naformátovaný – stačí nám k tomu tyhle dva řádky:
#!/bin/bash
# +-----column count
# | +---headers-----------------------------+ +---data--------------------+
# | | | | |
read -ra FSTAB <<< `echo "6 device mount_point type options dump pass"; cat /etc/fstab | grep -v "^#"`
sql-dk --db loopback --sql "…" --formatter tabular-prefetching --data "${FSTAB[@]}"
# |
# +---the statement is ignored
Takhle jednoduše to funguje v případě, že hodnoty neobsahují mezery. Pokud mezery potřebujeme, je nutné uvést parametry samostatně v uvozovkách nebo si třeba sestavit to pole v BASHi v cyklu.
Ukázka výstupu ve formě tabulky (můžeme si to vypsat i jako XML, XHTML, LaTeX atd.):
Tento JDBC ovladač je zatím trochu experimentální, takže je potřeba si ho ručně zapnout. Do souboru ~/.sql-dk/environment.sh
si přidejte:
CUSTOM_JDBC=(
"/usr/share/sql-dk/jdbc-loopback-driver.jar"
);
a v ~/.sql-dk/config.xml
si odkomentujte
<database>
<name>loopback</name>
<url>jdbc:loopback://</url>
<userName></userName>
<password></password>
</database>
a hned to můžeme otestovat:
$ sql-dk --db loopback --sql "…" --data 2 "a" "b" "x" "y" "z"
Jednou z důležitých vlastností SQL-DK jsou formátovače – díky nim si můžete vypsat data v různých formátech: na terminál, do XML souboru, jako XHTML stránku atd.
Když píšete dokument v (La)TeXu a máte v něm nějaké tabulky původem z databází, je otrava je při aktualizaci dat vždycky předělávat – exportovat z databáze, převádět do formátu TeXu… Tenhle proces je dobré automatizovat a s tím může pomoci právě SQL-DK. Ve verzi 0.9 přibyl formátovač pro TeX resp. LaTeX (časem přidám i jiné styly/formáty tabulek).
Propojíme to všechno dohromady a vyrobíme si PDF obsahující část informací ze souboru /etc/passwd
. Projekci a restrikci provedeme pomocí příkazů cut
a head
(protože loopback ovladač žádné skutečné SQL neumí).
TeXový formátovač umí obarvovat syntaxi (stejně jako XML a XHTML formátovače), což slouží jen pro větší přehlednost při čtení vygenerovaného kódu, pro normální výstup barvy samozřejmě nezapínáme.
Toto je první verze (La)TeX formátovače, ještě je tam co vylepšovat (např. výstup samotných tabulek bez hlavičky/patičky dokumentu nebo podpora čistého TeXu). Další nápady na vylepšení uvítám v diskusi.
Příště se podíváme na trochu sofistikovanější zpracování dat pomocí jiných JDBC ovladačů.
Tento článek zatím nikdo nekomentoval