Databaser
Lær SQLite, SQL, parameteriserede queries, transactions og repository pattern.
SQLite følger med Python og er perfekt til lokale værktøjer og mindre applikationer.
Opret en database
import sqlite3
connection = sqlite3.connect("app.db")
connection.row_factory = sqlite3.Row
connection.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE
)
""")
connection.commit()Parameteriser altid queries
name = "Ada"
email = "ada@example.com"
with connection:
connection.execute(
"INSERT INTO users (name, email) VALUES (?, ?)",
(name, email),
)Sæt aldrig input direkte ind i en SQL-string. Placeholders beskytter mod SQL injection og håndterer escaping korrekt.
Læs rækker
rows = connection.execute(
"SELECT id, name, email FROM users ORDER BY name"
).fetchall()
for row in rows:
print(row["id"], row["name"])Transactions
En transaction samler flere ændringer, så enten lykkes alle eller ingen. Det er afgørende ved eksempelvis overførsel af credits mellem to brugere.
Repository pattern
Læg SQL i en repository-class og hold forretningslogik i services. Så kan queries testes separat, og resten af programmet afhænger ikke direkte af SQLite.
Migrationer og produktion
Når schemaet udvikler sig, skal ændringer versionsstyres som migrationer. Til større websystemer bruges ofte PostgreSQL og et værktøj som SQLAlchemy eller psycopg.
Øvelse
Lav en SQLite-baseret task manager med create, list, complete og delete. Pak hver ændring i en transaction, og test at en ukendt task giver en kontrolleret fejl.