Zum Hauptinhalt springen

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

Mini-QuizWofuer ist g in Flask hier nuetzlich?

DB-Anbindung sitzt! Als Nächstes: Verbindung schließen.