Nun erweitern wir die kleine FastAPI-REST-API so, dass sie nicht nur mit einer Liste im Speicher arbeitet, sondern mit einer echten SQLite-Datenbank. Dazu nutzen wir SQLAlchemy als ORM (Object Relational Mapper).

Installation

pip install fastapi uvicorn sqlalchemy

 

Beispiel: REST-API mit SQLite & SQLAlchemy

from fastapi import FastAPI, HTTPException, Depends
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

# FastAPI App
app = FastAPI()

# SQLite DB einrichten
DATABASE_URL = "sqlite:///./users.db"
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# DB-Modell
class UserDB(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False)
email = Column(String, unique=True, index=True, nullable=False)

# Tabellen erstellen
Base.metadata.create_all(bind=engine)

# Pydantic Modell (für API)
class User(BaseModel):
id: int
name: str
email: str
class Config:
orm_mode = True

# Dependency für DB-Session
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

# 1) Alle User abrufen
@app.get("/users", response_model=list[User])
def get_users(db: Session = Depends(get_db)):
return db.query(UserDB).all()

# 2) User nach ID abrufen
@app.get("/users/{user_id}", response_model=User)
def get_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(UserDB).filter(UserDB.id == user_id).first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
return user

# 3) Neuen User anlegen
@app.post("/users", response_model=User, status_code=201)
def create_user(user: User, db: Session = Depends(get_db)):
db_user = UserDB(id=user.id, name=user.name, email=user.email)
db.add(db_user)
db.commit()
db.refresh(db_user)
return db_user

# 4) User aktualisieren
@app.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, updated_user: User, db: Session = Depends(get_db)):
user = db.query(UserDB).filter(UserDB.id == user_id).first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
user.name = updated_user.name
user.email = updated_user.email
db.commit()
db.refresh(user)
return user

# 5) User löschen
@app.delete("/users/{user_id}", status_code=204)
def delete_user(user_id: int, db: Session = Depends(get_db)):
user = db.query(UserDB).filter(UserDB.id == user_id).first()
if not user:
raise HTTPException(status_code=404, detail="User not found")
db.delete(user)
db.commit()
return

Server starten

uvicorn main:app --reload

Jetzt wird automatisch eine SQLite-Datenbank users.db im Projektordner angelegt, und die API arbeitet mit echten Tabellen.

 

Vorteile gegenüber der Listen-Version

  • Persistenz → Daten bleiben nach Server-Neustart erhalten.

  • Echte Datenbankfeatures → Indizes, Constraints, Joins usw.

  • Skalierbarkeit → später einfach auf PostgreSQL, MySQL oder eine Cloud-DB wechseln.

 

Joomla Error - Class JPlugin not found

Joomla Error - Class JPlugin not found

Das Joomla-Plugin „Verhalten – Abwärtskompatibilität 6“ (eingeführt in 5.4) ermöglicht einen reibungslosen Übergang von Joomla 5 auf Joomla 6. Es überbrückt Inkompatibilitäten, indem es veralteten Code (deprecated) weiter unterstützt. Es...

Read more

Joomla TinyMCE Editor flackert im Firefo…

Zur Beruhigung voran - es liegt sehr wahrscheinlich nicht an deinem Joomla-Setup allein, sondern an einer Inkompatibilität zwischen Firefox 148 und der TinyMCE-Initialisierung in Joomla.

Read more

E-Mail Marketing / Newsletter was gibt e…

E-Mail Marketing Tipps für Newsletter

Immer wieder weren wir gefragt "Wir würden gern einen Newsletter versenden. Wie gehen wir am besten vor? Ist doch kein Problem die Mails direkt über Outlook zu verdenden, oder?" -...

Read more

Widerrufbutton im Onlineshop

Widerrufbutton im Onlineshop

Bei allen B2C Fernabsatzverträgen muss es ab Spätestens ab dem 19. Juni 2026 möglich sein den geschlossenen Vertrag genauso einfach zu widerrufen wie abzuschließen. Was muss ich umbauen? Wie sieht eine Lösung für...

Read more

wasapi modus ausschalten

Um den WASAPI-Exklusivmodus in Windows zu deaktivieren, öffnen Sie über mmsys.cpl (Win+R) die Soundeinstellungen, wählen das Wiedergabegerät aus und entfernen unter „Eigenschaften“ > „Erweitert“ die Haken bei „Anwendungen haben alleinige...

Read more

JCE Fileupload maximum 1024kb

JCE Fileupload maximum 1024kb

Der JCE lässt nur Dateien bis 1024KB ( 1 MB ) zu

Read more

Joomla OSmap Update führt zu Fatal Error…

Joomla OSmap Updates

Die aktuellen Updates von OSMap Free verursachen Fehler bei einem Update.  Problem ist die Erweiterung "ShackExtensionSupport" darin befindet sich die Datei "AbstractScript.php"

Read more

Matomo Cronjob bei ALLinkl einrichten

Matomo (früher Piwik) ist ein Open-Source-Webanalyse-Tool, das ähnlich wie Google Analytics funktioniert, aber mit starkem Fokus auf Datenschutz, Datenhoheit und DSGVO-Konformität.Es kann entweder selbst gehostet (On-Premise) oder als Cloud-Lösung genutzt...

Read more

Unclosed regex pattern at position

Joomshaper Compress JS

Ein unschöner Fehler tritt im Zusammenspiel vom JoomShaper Template „shaper_helixultimate“ und dem Video Plugin „AllVideos (by JoomlaWorks)“ auf.

Read more
Wir nutzen Cookies auf unserer Website. Diese sind essenziell für den Betrieb der Seite, sogenannte Tracking Cookies werden nicht eingesetzt. Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.