Programmering nivå 2
Kap 4.5 – Använda SQLite-databaser
Skapa en databasfil, tabeller och SQL-frågor direkt från Python.
Mål med lektionen
När du har arbetat klart med denna lektion ska du:
- Förstå vad en relationsdatabas är och hur SQLite fungerar.
- Kunna skapa en databas och en tabell i Python med
sqlite3. - Kunna lägga till, hämta och visa data från en databas.
- Kunna använda SQL-frågor direkt i Pythonkod.
Så här lär du dig bäst
Du lär dig bäst genom att bygga ett enkelt system där du först skapar en databasfil, definierar en tabell och sedan utför några grundläggande operationer: lägg till, hämta och visa data. Börja med hårdkodad data och utveckla det till att ta in data från användaren. Jämför gärna med hur du tidigare lagrade information i textfiler.
Centrala begrepp
- SQLite - En lätt, filbaserad databas utan server, perfekt för små projekt.
- SQL - Ett språk för att prata med databaser, Structured Query Language.
- sqlite3 - Inbyggt bibliotek i Python för att arbeta med SQLite-databaser.
- CRUD - Create, Read, Update, Delete: vanliga operationer i databashantering.
Innehåll och exempel
Från textfil till databas
I kapitel 4.1 och 4.4 sparades data i textfiler. Det fungerar bra för enkla program, men det blir snabbt svårt att söka, sortera och uppdatera enskilda poster. En SQLite-databas är fortfarande en fil på datorn, men informationen ligger i tabeller med kolumner och rader.
I detta kapitel används recept som exempel. Tabellen recept kan jämföras med ett
kalkylblad:
idär ett unikt nummer för varje rad.namnär receptets namn.ingredienserär texten med ingredienser.
Arbetsflödet i sqlite3
När Python arbetar med SQLite återkommer samma grundsteg:
sqlite3.connect(...)öppnar eller skapar databasfilen.conn.cursor()skapar ett cursor-objekt som kan köra SQL-kommandon.cursor.execute(...)kör SQL, till exempelCREATE TABLE,INSERT INTOellerSELECT.conn.commit()sparar ändringar, till exempel efterINSERT INTO.conn.close()stänger anslutningen till databasen.
Skapa databas och tabell
import sqlite3
conn = sqlite3.connect("recept.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS recept (
id INTEGER PRIMARY KEY AUTOINCREMENT,
namn TEXT NOT NULL,
ingredienser TEXT
)
""")
conn.commit()
conn.close()
sqlite3.connect("recept.db") skapar databasfilen om den inte redan finns.
CREATE TABLE IF NOT EXISTS gör att tabellen skapas första gången programmet körs, men
inte skapas om ifall den redan finns.
INTEGER PRIMARY KEY AUTOINCREMENT gör att varje recept får ett automatiskt id.
TEXT NOT NULL betyder att kolumnen namn måste ha ett värde.
Visa databasen med SQLite Viewer i VS Code
För att lättare kunna se innehållet i databasen kan du installera tillägget SQLite Viewer av publisher Florian Klampfer.
- Öppna Extensions i VS Code.
- Sök efter
SQLite Viewer. - Kontrollera att publisher är
Florian Klampfer. - Installera tillägget.
- Kör Pythonprogrammet så att filen
recept.dbskapas. - Öppna
recept.dbi VS Code för att se databasens tabeller, kolumner och rader.
Tillägget används bara för att visa och inspektera databasen. Pythonprogrammet och SQLite fungerar även utan tillägget.
Lägga till data
conn = sqlite3.connect("recept.db")
cursor = conn.cursor()
namn = "Pannkakor"
ingredienser = "mjölk, mjöl, ägg"
cursor.execute(
"INSERT INTO recept (namn, ingredienser) VALUES (?, ?)",
(namn, ingredienser)
)
conn.commit()
conn.close()
Frågetecknen i SQL-frågan är platshållare. Värdena skickas in separat i en tuple. Det gör koden tydligare och säkrare än att bygga SQL-frågan genom att klistra ihop textsträngar.
conn.commit() är viktigt här. INSERT INTO förbereder ändringen, men
commit() sparar den i databasfilen.
Hämta och visa data
conn = sqlite3.connect("recept.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM recept")
rader = cursor.fetchall()
for rad in rader:
print(f"Recept: {rad[1]}")
print(f"Ingredienser: {rad[2]}")
conn.close()
SELECT * FROM recept hämtar alla rader från tabellen. Med fetchall() får du
tillbaka raderna så att du kan loopa igenom dem i Python.
Varje rad kommer tillbaka som en tuple. I exemplet betyder rad[0] id,
rad[1] receptets namn och rad[2] ingredienserna.
Öva - Gör ett mini-receptregister
- Skapa ett Pythonprogram med tre funktioner: lägg till ett recept, visa alla recept och avsluta programmet.
- Använd SQLite för att spara recepten i en databas.
- Skapa en meny i konsolen för att välja funktion.
Komplett kodexempel
import sqlite3
DB_NAMN = "recept.db"
def skapa_databas_och_tabell():
conn = sqlite3.connect(DB_NAMN)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS recept (
id INTEGER PRIMARY KEY AUTOINCREMENT,
namn TEXT NOT NULL,
ingredienser TEXT
)
""")
conn.commit()
conn.close()
def lägg_till_recept(namn, ingredienser):
conn = sqlite3.connect(DB_NAMN)
cursor = conn.cursor()
cursor.execute(
"INSERT INTO recept (namn, ingredienser) VALUES (?, ?)",
(namn, ingredienser)
)
conn.commit()
conn.close()
print(f"Receptet '{namn}' har lagts till.")
def visa_alla_recept():
conn = sqlite3.connect(DB_NAMN)
cursor = conn.cursor()
cursor.execute("SELECT * FROM recept")
rader = cursor.fetchall()
if not rader:
print("Inga recept hittades.")
else:
for rad in rader:
print(f"\nRecept: {rad[1]}")
print(f"Ingredienser: {rad[2]}")
conn.close()
def main():
skapa_databas_och_tabell()
while True:
print("\nMeny:")
print("1. Lägg till recept")
print("2. Visa alla recept")
print("3. Avsluta")
val = input("Välj: ")
if val == "1":
namn = input("Receptets namn: ")
ingredienser = input("Ange ingredienser (kommaseparerade): ")
lägg_till_recept(namn, ingredienser)
elif val == "2":
visa_alla_recept()
elif val == "3":
print("Avslutar programmet.")
break
else:
print("Ogiltigt val. Försök igen.")
if __name__ == "__main__":
main()
Interaktiv övning: simulera SQLite-recept
Testa det kompletta kodexemplet utan att skapa en riktig databasfil. Övningen simulerar tabellen
recept, men visar samma steg som koden använder: skapa tabell, INSERT INTO,
commit(), SELECT och fetchall().
Programmering 2-koppling: i ett riktigt program skapas
filen recept.db. Här visas samma logik i webbläsaren så du kan se vad som händer
steg för steg.
Sammanfattning
- Du kan nu skapa och använda SQLite-databaser i Python.
- Du har använt SQL för att skapa tabeller, lägga till och läsa data.
- Du har byggt ett strukturerat program som lagrar information i en riktig databasfil.