Databáze

Knihovna Haskellu HDBC nabízí jednoduché rozhraní pro přístup k databázovým systémům SQLite, MySQL a PostgreSQL. My si vyzkoušíme práci s databází SQLite, protože je nejjednodušší na zprovoznění.

Instalace

Před instalací je nutné mít v systému přítomny vývojářské knihovny SQLite3 (libsqlite3-dev). K samotnému nainstalování by mělo stačit napsat známé dva příkazy:

$ cabal update
Downloading the latest package list from hackage.haskell.org
$ cabal install HDBC-sqlite3
Resolving dependencies...
...

Jestliže automatická instalace selže, zkuste použít tuto sadu příkazů:

cabal install convertible testpack-1.0.2
wget http://hackage.haskell.org/packages/archive/HDBC/2.2.2/HDBC-2.2.2.tar.gz
aunpack HDBC-2.2.2.tar.gz && rm HDBC-2.2.2.tar.gz && cd HDBC-2.2.2
cabal configure && cabal build && cabal copy && cabal register
cd ..
wget http://hackage.haskell.org/packages/archive/HDBC-sqlite3/2.3.0.0/HDBC-sqlite3-2.3.0.0.tar.gz
aunpack HDBC-sqlite3-2.3.0.0.tar.gz && rm HDBC-sqlite3-2.3.0.0.tar.gz && cd HDBC-sqlite3-2.3.0.0
cabal configure && cabal build && cabal copy && cabal register
cd ..
rm -rf HDBC-2.2.2 HDBC-sqlite3-2.3.0.0

Použití knihovny

Nejprve se musíme připojit k databázi, což nám zajišťuje funkce connectSqlite3 z modulu Database.HDBC.Sqlite3, která vrací databázové spojení (database handle). Databáze je u databázového systému SQLite obyčejný soubor, není tedy třeba využívat speciální rozhraní s přihlašovacími údaji. Funkce k samotnému zadávání SQL dotazů poskytuje modul Database.HDBC. Nejdůležitější jsou funkce run, jež vrací počet ovlivněných řádků, a quickQuery (případně její striktní varianta quickQuery), jež vrací seznam databázových hodnot. Zjednodušeně řečeno funkci quickQuery budeme používat na SQL dotazy obsahující příkaz SELECT a na zbylé dotazy použijeme funkci run. Do obou funkcí můžeme volitelně zadat tzv. seznam zástupných parametrů sloužící k ochraně proti tzv. SQL injekcím (SQL injections). Protože se z důvodů zpožděného provádění SQL příkazy nevykonávají ihned, je třeba po každém příkazu zavolat funkci commit, aby došlo k zápisu do databázového souboru. Lze také použít funkci withTransaction, která zavolá funkci commit automaticky.

Příklad použití funkce withTransaction spolu s vložením hodnot do tabulky a následným seřazeným výběrem všech řádků z tabulky:

import Control.Exception
import Database.HDBC
import Database.HDBC.Sqlite3

main :: IO ()
main = bracket (connectSqlite3 "test.db") disconnect $ \h -> withTransaction h $ \h -> do
    run h "INSERT INTO users (id, name) VALUES (?, ?)" [iToSql 12345, toSql "Jan Novák"]
    quickQuery h "SELECT * FROM users ORDER BY id DESC" [] >>= print

Několik dalších příkladů je popsáno v knize Real World Haskell.

← IB016