Datenbankzugriff in Flask
Muster
import sqlite3
from pathlib import Path
from flask import Flask, g
app = Flask(__name__)
DB = Path("app.db")
def get_db():
if "db" not in g:
g.db = sqlite3.connect(DB)
g.db.row_factory = sqlite3.Row
return g.db
def init_db():
db = sqlite3.connect(DB)
db.execute(
"""
CREATE TABLE IF NOT EXISTS todos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
done INTEGER DEFAULT 0
)
"""
)
db.commit()
db.close()
@app.before_request
def _open():
get_db()
g speichert Request-lokale Daten – eine DB-Verbindung pro Request ist ein gängiges Muster.
Rate mal!
Warum row_factory = sqlite3.Row?
Auflösung
Zeilen wie Dicts nutzen: row["title"].
Probiere es selbst
Experiment 1
DB-Datei anlegen.
Experiment 2
init_db einmal ausführen.
Experiment 3
get_db skizzieren.
Übungen
Level 1
Tabelle todos erklären.
Level 2
CREATE Statement schreiben.
Level 3
Warum nicht eine globale Connection für immer (Idee)?
Level-3-Hinweis
Threads/Requests können sich in die Quere kommen – Request-lokal ist sicherer.
Mini-Quiz
DB-Anbindung sitzt! Als Nächstes: Verbindung schließen.