Jak vytvořit registrační aplikaci s Pythonem a databází

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.