Lekce 1 - Úvod do databází v Pythonu
Vítám vás u první lekce kurzu o programování databázových aplikací v Pythonu. Kurz zpracovává pokročilou problematiku co možná nejjednodušeji a s co nejvíce příklady a ilustracemi. Probereme v něm teorii i praxi a několik přístupů, které se v Pythonu pro práci s databází používají. Kurz popisuje práci s SQLite, MySQL (MariaDB) a dalších databází v jazyce Python. Na síti se nachází také podrobnější kurzy o SQL databázích (nezávisle na jazyce), jež doporučuji prostudovat. Nebo aspoň tu, jež hodláte používat.
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, nebo ne?
RDBMS
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 budeme dále používat označení databázový stroj nebo RDBMS. Databázový stroj 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. Nad tímto jazykem vzniklo mnoho nadstaveb a někdy se už dokonce s SQL vůbec nesetkáme. My si v kurzu ukážeme různé přístupy a budeme s databází komunikovat jak pomocí SQL, tak jako s objekty pomocí technologie ORM a pomocí GUI.
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).
Python a SQL
V Pythonu se pracuje s velkou množinou databází typu SQL i NoSQL (MongoDB). Nutno však říct, že samotný jazyk Python nemá žádnou přímou podporu žádné z nich. Ovšem jeho součástí se stala knihovna pro SQLite, která se používá jako hlavní a nejdůležitější.
Pomocí různých knihoven lze však použít širokou škálu databází:
včetně různých ORM knihoven a dokonce lze v do Pythonu importovat tabulky z MS-Office (Excel). Většina z těchto knihoven má výraznou komunitní podporu a nepřetržitý vývoj. Žádnou z nich nelze označit nijak přednostně a vždy záleží na aktuálním použití.
Pro "desktop" asi použijete SQLite nebo PostgreSQL, zatímco na webu dáte přednost MySQL, MariaDB. Velké pozitivum je, že téměř všechny tyto knihovny používají skoro stejné rozhraní.
Python IDE a SQL
Jedním z nejlepších vývojářských prostředí, které podporují SQL je PyCharm, ovšem pouze v placené verzi. Komunitní verze je z tohoto privilegia vyřazena. Proto je lépe mít vhodný univerzální program, který se snadno spojí s téměř jakoukoli databází na lokálním počítači a bez nutnosti použít internetový prohlížeč.
DBeaver
DBeaver – nástroj umožní práci s několika desítkami databází různých typů.
Ovládání toho programu je poměrně intuitivní a ne nepodobné takovým,
jako je SQLite Studio, nebo manager pro Postre. Jednoduše si v menu
Database
vyberete New Database Connection
, zvolíte
typ z nabídky, kde zadáte připojovací údaje a můžete pracovat s daty.
Připojené databáze zůstávají v seznamu a lze tedy manipulovat se mnoha informacemi na různých místech z jednoho bodu. Ovšem pro serverové stroje je nutno mít daný systém instalovaný nebo mít přístup na vzdálený server – takové spojení v tomto programu je též možné.
Relační databáze
SQL databáze jsou (není mi známa výjimka) tzv. relační databáze. 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í. Použité databáze jsou typované, to znamená, že každý sloupec má pevně stanovený datový typ (číslo, znak, krátký text, dlouhý text, ...) a může obsahovat hodnoty jen tohoto typu. 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.
V další lekci, Python a databáze SQLite, si ukážeme práci se SQL databází pomocí knihovny SQLite3.