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í.
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
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.