Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Úvod do databází v C++ a Qt

Vítejte v kurzu, ve kterém se naučíme programovat databázové aplikace v C++.

Každý programátor řeší otázku ukládání dat své aplikace, tzv. otázku persistence. Někdy mu stačí jen data v paměti, ale mnohdy je potřebuje uložit externě, aby zůstala dostupná, i když aplikaci zavřeme a spustíme znovu.

K čemu databázi?

Možná vás napadlo, k čemu vlastně potřebujeme nějakou databázi. Data bychom stejně dobře mohli ukládat do nějakých textových souborů, binárek, XML nebo něčeho podobného. Určitě by to nějak fungovalo, my jsme již data ukládali jako soubor ve formátu JSON, proč to nestačí?

RDBMS

RDBMS - Databáze v C++ pomocí Qt SQL

Označení databáze je vlastně nepřesné a v odborné literatuře se setkáme s označením RDBMS (Relation DataBase Management System). Česky je to přeloženo jako "systém řízení báze dat", což zní opravdu hrozně a proto budu dále používat označení databázový stroj nebo RDBMS. Databázový stroj (my budeme používat SQLite, ale můžete úplně stejně pracovat s jakoukoli jinou DB) není jen úložiště dat. Jedná se o velmi sofistikovaný a odladěný nástroj, který za nás řeší spoustu problémů a zároveň je extrémně jednoduchý k použití. S databází totiž komunikujeme jazykem SQL, kterým jsou v podstatě lidsky srozumitelné věty.

Spolu s ukládáním dat je ale třeba dále řešit mnoho dalších věcí. Asi by nás napadlo např. zabezpečení nebo optimalizace výkonu. RDBMS toho ale dělá ještě mnohem více, řeší za nás problém současné editace stejné položky několika uživateli ve stejný okamžik, který by jinak mohl zapříčinit nekonzistenci databáze. RDBMS data v tomto případě zamkne a odemkne až po vykonání zápisu. Dále umožňuje spojovat několik dotazů do transakcí, kdy se série dotazů vykoná vždy celá nebo vůbec. Nestane se, že by se vykonala jen část. Tyto vlastnosti databázového stroje jsou shrnovány zkratkou ACID, pojďme si ji vysvětlit.

ACID

ACID je akronym slov Atomicity (nedělitelnost), Consistency (validita), Isolation (izolace) a Durability (trvanlivost). Jednotlivé složky mají následující význam:

  • Atomicity - Operace v transakci se provedou jako jedna atomická (nedělitelná) operace. Tzn. že pokud nějaká část operace selže, vrátí se databáze do původního stavu a žádné části transakce nebudou provedeny. Reálný příklad je např. převod peněz na bankovním účtu. Pokud se nepodaří peníze odečíst z jednoho účtu, nebudou ani připsány na účet druhý. Jinak by byla databáze v nekonzistentním stavu. Pokud bychom si práci s daty řešili sami, mohlo by se nám toto velmi jednoduše stát.
  • Consistency - Stav databáze po dokončení transakce je vždy konzistentní, tedy validní podle všech definovaných pravidel a omezení. Nikdy nenastane situace, že by se databáze nacházela v nekonzistentním stavu.
  • Isolation - Operace jsou izolované a navzájem se neovlivňují. Pokud se sejde v jeden okamžik více dotazů na zápis do stejného řádku, jsou vykonávány postupně, jako ve frontě.
  • Durability - Všechna zapsaná data jsou okamžitě zapsána na trvanlivá úložiště (na pevný disk), v případě výpadku el. energie nebo jiného přerušení provozu RDBMS vše zůstane tak, jak bylo těsně před výpadkem.

Databáze (přesněji databázový stroj) je tedy černá skříňka, se kterou naše aplikace komunikuje a do které ukládá veškerá data. Její použití je velmi jednoduché a je odladěna tak, jak bychom si sami zápis dat v programu asi těžko udělali. Vůbec se nemusíme starat o to, jak jsou data fyzicky uložena, s databází komunikujeme pomocí jednoduchého dotazovacího jazyka SQL, viz dále. V dnešní době se vůbec nevyplatí zatěžovat se otázkou ukládání dat, jednoduše sáhneme po hotové databázi, kterých je obrovský výběr a jsou většinou zadarmo. O databázi občas hovoříme jako o 3. vrstvě aplikace (1. vrstva je uživatelské rozhraní, 2. vlastní logika aplikace, 3. je právě datová vrstva).

Relační databáze

V tomto kurzu budeme používat tzv. relační databáze, což jsou i ty nejpopulárnější. Tento pojem označuje databázi založenou na tabulkách. Každá tabulka obsahuje položky jednoho typu. Můžeme mít tedy tabulku uzivatele, další tabulku clanky a další třeba komentare.

Databázovou tabulku si můžeme představit třeba jako tabulku v Excelu. Tabulka uzivatele by mohla vypadat asi takto:

Jméno Příjmení Datum narození Počet článků
Jan Novák 11.3.1984 17
Tomáš Marný 1.2.1989 6
Josef Nový 20.12.1972 9
Michaela Slavíková 14.8.1990 1

Položky (konkrétně zde uživatelé) ukládáme na jednotlivé řádky, sloupce pak označují atributy (vlastnosti, chcete-li), které položky mají. Pokud chceme s relační databází rozumně pracovat, každý řádek v tabulce by měl být opatřený unikátním identifikátorem. U uživatelů by to mohlo být třeba rodné číslo, mnohem častěji se však používají identifikátory umělé a to tak, že uživatele prostě očíslujeme. K tomu se dostaneme později.

Slovo relační označuje vztah (anglicky relation). Ten je mezi tabulkami nebo mezi entitami v jedné tabulce. To si ale necháme na jindy a zatím budeme pracovat jen s jednou tabulkou zároveň.

Potřebné nástroje

Jaké že nástroje v tomto kurzu o práci s databázemi v C++ budeme používat?

SQL

Tím prvním je jazyk SQL. Pokud jste se s SQL ještě nesetkali, SQL dotazy si zde budeme popisovat. Nebudeme jim ale věnovat tolik času, jako je jim věnováno v kurzu zaměřeném jen na ně, protože budeme pracovat i s C++. Takže pokud chcete SQL umět dobře, je dobrý nápad podívat se také na základy jazyka SQL (pro databázi SQLite).

Qt framework

Pro práci s databází v C++ existuje hned několik knihoven. My budeme používat Qt SQL, které je součástí nám již známého frameworku Qt5.

Qt framework pro C++ - Databáze v C++ pomocí Qt SQL

Qt (čte se jako anglické slovo "cute" = roztomilý) je populární framework pro tvorbu nejen formulářových aplikací, který lze využít na mnoha platformách i v mnoha programovacích jazycích. Již jsme v něm vytvářeli formulářové aplikace v C++ a protože když pracujeme s databází, typicky chceme data i nějak graficky vypisovat a zadávat, hodí se nám, že nemusíme používat několik knihoven najednou, ale vystačíme si s Qt. Qt framework nám nabízí celkem širokou škálu podpory různých databázových systémů, viz. dokumentace. Pokud jste s Qt frameworkem ještě nepracovali, připravte si jej podle pokynů v lekci Instalace Qt frameworku pro C++.

SQLite

Databáze SQLite v C++ - Databáze v C++ pomocí Qt SQL

Protože nechceme instalovat žádnou složitou službu, jako je třeba např. pro běh MySQL, použijeme rychlou a jednoduchou databázi SQLite. Ta má v Qt výhodu - je přímo jeho součástí, není tedy třeba nic dalšího.

Na rozdíl od velkých databází jako MySQL/MariaDB, PostgreSQL, které běží jako služba, je SQLite pouze malá knihovna nástrojů, kterou mají již některé jazyky a frameworky zabudovanou v sobě. Každá databáze se ukládá jako jeden obyčejný soubor na disk, většinou s příponou .db, který je bez problémů přenositelný. Pro přenos projektu tedy stačí často pouze zkopírovat aplikaci se souborem s databází a spustit, žádné instalování služby databáze, nastavování přihlašovacích údajů v aplikaci, dumpování a následný import databáze. SQLite se z tohoto důvodu hojně využívá zejména v desktopových aplikacích. Za toto a za její rychlost se ale musíte smířit i s jejími nedostatky.

Jak už název napovídá, databáze je velmi odlehčená, takže neobsahuje třeba uživatelské oprávnění, konfiguraci (která je možná částečně přes PRAGMA příkazy), či plnou podporu UTF, pokud tedy očekáváte korektní české řazení např. č po c, tak marně, buď si to sami dopíšete přímo v SQLite, nebo to necháte až na aplikaci.

Databázi tedy již máme, něco by se k ní však přeci jen hodilo - nějaký vizuální správce.

Osobně mohu doporučit SQLite Studio, které funguje jak na Windows, tak na Linuxu a navíc je také psané v Qt.

To je k úvodu již opravdu vše.

V příští lekci, Databáze v C++ a Qt - Připojení k databázi a nová tabulka, si vytvoříme svou první databázovou aplikaci v C++, SQLite a Qt!


 

Všechny články v sekci
Databáze v C++ pomocí Qt SQL
Přeskočit článek
(nedoporučujeme)
Databáze v C++ a Qt - Připojení k databázi a nová tabulka
Článek pro vás napsal Virlupus
Avatar
Uživatelské hodnocení:
8 hlasů
Autor se věnuje webovým aplikacím, skladově-účetnímu softwaru, 3D grafice, lexiální analýze a parserování. Studuje fyziku na MFF UK. Učil IT na střední škole.
Aktivity