Python ve své standardní knihovně nabízí skvělou podporu pro databáze. To vám umožňuje vytvářet a pracovat s databázemi bez nutnosti spoléhat se na externí nástroje, jako je například Django ORM.
SQLite je odlehčená databáze, která se snadno integruje s Pythonem. Seznamte se s hlavními principy programování databází v Pythonu prostřednictvím jednoduché aplikace pro registraci uživatelů.
Jak založit databázi v Pythonu
Pro vytvoření a interakci s databází v Pythonu jsou potřeba dvě klíčové komponenty: připojení a kurzor.
Připojení slouží k propojení s již existující databází nebo k vytvoření nové. Následuje postup, jak vytvořit připojení k databázi v Pythonu pomocí SQLite:
import sqlite3 conn = sqlite3.connect('cesta/k/databazi.db') conn.close()
Metoda connect() vyžaduje jako argument cestu k existující databázi. Pokud v zadané cestě žádná databáze není, bude vytvořena. Po ukončení práce s databází by mělo být připojení uzavřeno.
Kurzor umožňuje interakci s připojenou databází. Používá se ke spouštění SQL dotazů v rámci programu Python. Následuje ukázka, jak vytvořit kurzor:
cursor = conn.cursor() cursor.close()
Kurzor se vytvoří voláním metody cursor() na otevřeném objektu připojení.
Jak provést databázovou transakci v Pythonu
Prostřednictvím kurzoru je možné spouštět SQL příkazy, dotazy, skripty, číst a zapisovat data nebo měnit strukturu databáze.
Existují tři základní metody pro provádění databázových transakcí:
- Cursor.execute. Tato metoda slouží ke spuštění jednoho SQL příkazu. Používá se takto:
cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( name TEXT, age INTEGER ) """)
Tento kód volá metodu execute na kurzoru a předává jí řetězec s SQL příkazem.
- Cursor.executemany. Tato metoda umožňuje opakované spuštění jednoho SQL příkazu s různými parametry. Vyžaduje dva argumenty: SQL příkaz a iterovatelný objekt. Je vhodná například pro vkládání více záznamů do databáze najednou:
data = [ ('Alice', 25), ('Bob', 30), ('Charlie', 22) ] cursor.executemany("""INSERT INTO users (name, age) VALUES (?, ?)""", data)
Výše uvedený kód využívá metodu executemany k vložení více hodnot do databáze.
Všimněte si zástupných znaků `?` v SQL příkazu. Metoda executemany je nahradí odpovídajícími hodnotami z každého objektu.
- Cursor.executescript. Jak už název napovídá, tato metoda provede SQL skript. SQL příkazy lze zapsat do externího souboru a spustit je pomocí této metody:
with open("cesta/k/skriptu.sql") as file: sql_script = file.read() cursor.executescript(sql_script)
Jak vytvořit registrační aplikaci s Pythonem a SQLite3
Logika registrační aplikace spočívá v získání uživatelských údajů prostřednictvím Pythonu a jejich uložení do databáze. Následující kroky vám ukáží, jak vytvořit jednoduchý registrační systém pomocí Pythonu a SQLite3.
Krok 1: Připojení k existující databázi nebo vytvoření nové
Začněte vytvořením nové databáze pro vaši aplikaci nebo připojením k existující:
import sqlite3 conn = sqlite3.connect('databaze.db') cursor = conn.cursor() cursor.close() conn.close()
Výše uvedený kód vytvoří objekt připojení a kurzor pro interakci s připojenou databází.
Krok 2: Vytvoření tabulky pro uživatele
Je nutné vytvořit tabulku pro ukládání dat, které uživatelé zadají při registraci. Zde je návod, jak ji vytvořit pomocí kurzoru:
cursor.execute(""" CREATE TABLE IF NOT EXISTS users ( first_name TEXT, last_name TEXT, email TEXT UNIQUE, password TEXT ) """) conn.commit()
Tento kód vytvoří tabulku s názvem „users“, pokud ve vaší databázi ještě neexistuje. V tabulce se vytvoří čtyři sloupce pro uložení uživatelských informací. Pole „email“ je unikátní, aby se zabránilo vytváření více účtů s totožným e-mailem.
Volání `conn.commit()` je zásadní pro potvrzení dotazu do databáze. Bez něj se změny v databázi neprojeví.
Pokud používáte metodu `executescript`, můžete do SQL souboru na konec přidat klíčové slovo `COMMIT`, čímž se vyhnete nutnosti volat `conn.commit()`.
Krok 3: Sběr uživatelských dat
Funkce Pythonu usnadňují opakované použití kódu, proto je vhodné vytvořit funkci pro zpracování registrace. Tato funkce bude shromažďovat křestní jméno, příjmení, e-mail a heslo uživatele.
def register_user(): first_name = input("Zadejte křestní jméno: ") last_name = input("Zadejte příjmení: ") email = input("Zadejte e-mail: ") password1 = input("Zadejte heslo: ") password2 = input("Potvrďte heslo: ")
Krok 4: Kontrola správnosti hesla
Upravte funkci `register_user`, aby se ověřilo, zda uživatel zadal stejné heslo dvakrát. Pokud ne, měla by být uživateli zobrazena výzva k opětovnému zadání hesla. Toho lze dosáhnout pomocí smyčky:
def register_user(): first_name = input("Zadejte křestní jméno: ") last_name = input("Zadejte příjmení: ") email = input("Zadejte e-mail: ") while True: password1 = input("Zadejte heslo: ") password2 = input("Potvrďte heslo: ") if password1 == password2: print("Registrace proběhla úspěšně!") break else: print("Hesla se musí shodovat")
S touto úpravou se uživatel nemůže registrovat, dokud se jeho hesla neshodují.
Krok 5: Kontrola jedinečnosti e-mailu
SQL příkaz, který vytváří tabulku uživatelů, definuje pole „email“ jako jedinečné. To znamená, že databáze vrátí chybu, pokud se uživatel pokusí zaregistrovat e-mail, který již existuje. Pro správné zpracování této situace je třeba ošetřit výjimku Pythonu:
def register_user(): first_name = input("Zadejte křestní jméno: ") last_name = input("Zadejte příjmení: ") while True: email = input("Zadejte e-mail: ") password1 = input("Zadejte heslo: ") password2 = input("Potvrďte heslo: ") if password1 == password2: try: print("Účet byl úspěšně vytvořen.") break except sqlite3.IntegrityError: print("Chyba: Tento e-mail je již registrován.") else: print("Hesla se musí shodovat.")
Tento kód používá blok `try-except` pro zachycení chyby, která vznikne v důsledku duplicitních e-mailů. Pokud databáze vyvolá chybu `IntegrityError`, smyčka `while` pokračuje a vyzve uživatele k zadání jiné e-mailové adresy.
V tomto příkladu lze bezpečně předpokládat, že k chybě `IntegrityError` dojde pouze z důvodu duplicitního e-mailu. Ve skutečné aplikaci byste pravděpodobně použili pokročilejší zpracování chyb k řešení dalších možných problémů.
Krok 6: Vložení uživatelských dat do databáze
Nyní, když jste shromáždili a ověřili uživatelská data, je čas je přidat do databáze. To lze provést pomocí SQL dotazu. Upravte svůj blok `try-except` následovně:
try: cursor.execute(""" INSERT INTO users (first_name, last_name, email, password) VALUES (?, ?, ?, ?) """, (first_name, last_name, email, password2)) conn.commit() print("Účet byl úspěšně vytvořen.") break except sqlite3.IntegrityError: print("Chyba: Tento e-mail je již registrován.")
V upraveném bloku `try-except` kurzor provede SQL operaci vložení. Nakonec metoda `conn.commit` potvrdí SQL operaci do databáze.
Pokud jste dodrželi všechny výše uvedené kroky, měli byste mít funkční aplikaci, která registruje uživatele a ukládá je do databáze. Obsah databáze můžete zobrazit pomocí nástroje, jako je DB Browser for SQLite:
Využití databází namísto typů kolekcí
Pro jednoduché databáze může být jednodušší vytvořit vlastní kód. S rostoucí složitostí vaší aplikace a databáze zvažte použití nástrojů, jako je Django ORM, které zjednodušují práci s databázemi.
Pro procvičení dovedností v oblasti nízkoúrovňové práce s databázemi se pokuste implementovat přihlašovací systém jako doplněk k registračnímu programu.