Programmering nivå 2

Kap 4.7 – Miniuppgift: Använda SQLite-databaser

Bygg ett litet bibliotekssystem med databas, moduler och sökning.

Mål med lektionen

När du har arbetat klart med denna lektion ska du kunna:

  • Skapa och använda en SQLite-databas i Python med biblioteket sqlite3.
  • Skapa tabeller, lägga till poster, söka efter data och läsa ut all data från databasen.
  • Strukturera din kod i moduler med funktioner för bättre överblick.
  • Använda try/except-block för att hantera vanliga fel vid databasanslutning.

Så här lär du dig bäst

Arbeta med konkreta exempel: börja med att skapa databasen och tabellen. Skriv sedan funktioner för att lägga till data, visa alla poster och söka i databasen. Dela upp din kod i minst två moduler - en för gränssnittet och en för databasanropen. Testa dina funktioner separat och se till att varje steg fungerar innan du går vidare.

Centrala begrepp

  • SQLite - En lätt, filbaserad databas som inte kräver någon server.
  • SQL - Structured Query Language, språket som används för att kommunicera med databasen.
  • Moduler - Att dela upp din kod i olika .py-filer med specifika funktioner.
  • Felhantering - Att förutse och hantera fel vid till exempel anslutning eller SQL-kommandon.

Struktur för ditt program

Skapa två filer i samma mapp:

  • databas.py - innehåller all kod som pratar med databasen.
  • main.py - innehåller menyn och användarens val.

Databasmodul: databas.py

import sqlite3

DB_FIL = "bibliotek.db"

def skapa_databas():
    try:
        conn = sqlite3.connect(DB_FIL)
        cursor = conn.cursor()
        cursor.execute("""
            CREATE TABLE IF NOT EXISTS bocker (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                titel TEXT NOT NULL,
                forfattare TEXT NOT NULL
            )
        """)
        conn.commit()
        conn.close()
    except Exception as e:
        print("Fel vid skapande av databas:", e)

def lagg_till_bok(titel, forfattare):
    try:
        conn = sqlite3.connect(DB_FIL)
        cursor = conn.cursor()
        cursor.execute(
            "INSERT INTO bocker (titel, forfattare) VALUES (?, ?)",
            (titel, forfattare)
        )
        conn.commit()
        conn.close()
        print("Bok tillagd!")
    except Exception as e:
        print("Kunde inte lägga till bok:", e)

def sok_bok(nyckelord):
    try:
        conn = sqlite3.connect(DB_FIL)
        cursor = conn.cursor()
        cursor.execute(
            "SELECT * FROM bocker WHERE titel LIKE ? OR forfattare LIKE ?",
            ("%" + nyckelord + "%", "%" + nyckelord + "%")
        )
        resultat = cursor.fetchall()
        conn.close()

        for bok in resultat:
            print(f"{bok[0]}. {bok[1]} - {bok[2]}")

        if not resultat:
            print("Inga träffar.")
    except Exception as e:
        print("Sökning misslyckades:", e)

def visa_alla_bocker():
    try:
        conn = sqlite3.connect(DB_FIL)
        cursor = conn.cursor()
        cursor.execute("SELECT * FROM bocker")
        resultat = cursor.fetchall()
        conn.close()

        for bok in resultat:
            print(f"{bok[0]}. {bok[1]} - {bok[2]}")

        if not resultat:
            print("Inga böcker finns än.")
    except Exception as e:
        print("Kunde inte hämta böcker:", e)

Huvudfil: main.py

import databas

def visa_meny():
    print("\nMeny:")
    print("1. Lägg till bok")
    print("2. Sök bok")
    print("3. Visa alla böcker")
    print("4. Avsluta")

def main():
    databas.skapa_databas()

    while True:
        visa_meny()
        val = input("Välj alternativ: ")

        if val == "1":
            titel = input("Titel: ")
            forfattare = input("Författare: ")
            databas.lagg_till_bok(titel, forfattare)
        elif val == "2":
            nyckelord = input("Sökord (titel/författare): ")
            databas.sok_bok(nyckelord)
        elif val == "3":
            databas.visa_alla_bocker()
        elif val == "4":
            print("Avslutar...")
            break
        else:
            print("Ogiltigt val.")

if __name__ == "__main__":
    main()

Att testa

  • Kör main.py och kontrollera att filen bibliotek.db skapas.
  • Lägg till flera böcker med olika titlar och författare.
  • Sök på både titel och författare för att se att LIKE-frågan fungerar.
  • Stäng programmet, starta det igen och kontrollera att böckerna finns kvar.

Du kan även öppna bibliotek.db i VS Code med tillägget SQLite Viewer av publisher Florian Klampfer för att se tabellen och raderna visuellt.

Sammanfattning

  • Du har skapat en komplett programstruktur för databashantering med SQLite.
  • Du har använt funktioner och moduler för att organisera koden.
  • Du har arbetat med SQL-kommandon för att söka, spara och läsa data.
  • Du är nu redo att ta dig an Lärarbedömd uppgift 4 med god förberedelse.

Tillbaka till Kapitel 4