Get connection from config file, Add Zoo-Aufgabe-MongoDB.ipynb

This commit is contained in:
Michael Schären 2026-05-08 11:20:48 +02:00
parent 5cbda2dca7
commit 1e4841948c
6 changed files with 527 additions and 190 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.db_config.json

View File

@ -2,7 +2,7 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
<orderEntry type="jdk" jdkName="$USER_HOME$/anaconda3" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

Binary file not shown.

View File

@ -0,0 +1,274 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Zoo-Verwaltung in MongoDB\n",
"\n",
"In diesem Beispiel soll die einfache Zoo-Verwaltung aus der Aufgabe zuvor in MongoDB umgesetzt werden. \n",
"\n",
"Installieren Sie dazu zunächst MongoDB auf Ihrem Rechner, hier finden Sie den Download und die Dokumentation zur Installation:\n",
"https://www.mongodb.com/try/download/community\n",
"\n",
"Um MongoDB in Python zu verwenden, benötigen Sie das Modul `pymongo`. Installieren Sie es mit dem folgenden Befehl:\n",
"\n",
" conda install conda-forge::pymongo\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:56.611402767Z",
"start_time": "2026-05-08T09:19:56.593625065Z"
}
},
"source": [
"# Client importieren\n",
"from pymongo import MongoClient"
],
"outputs": [],
"execution_count": 38
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:59.004412525Z",
"start_time": "2026-05-08T09:19:58.962687290Z"
}
},
"source": [
"# Verbindungsaufbau zu einer MongoDB-Datenbank\n",
"client = MongoClient('localhost', 27017)\n",
"\n",
"# Zoo-Datenbank erstellen\n",
"db = client['zoo']\n",
"\n",
"# Beispiel-Dokument in Collection 'animals' erstellen\n",
"db.animals.insert_one({'name': 'Ella', 'species': 'elephant'})\n",
"\n",
"# Alle Dokumente in Collection 'animals' ausgeben\n",
"for animal in db.animals.find():\n",
" print(animal)"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'_id': ObjectId('69fda3a4eabd702ea246e9c7'), 'name': 'Babar', 'species': 'Elephant', 'zookeeper_id': ObjectId('69fda3a4eabd702ea246e9c5')}\n",
"{'_id': ObjectId('69fda3a4eabd702ea246e9c8'), 'name': 'Dumbo', 'species': 'Elephant', 'zookeeper_id': ObjectId('69fda3a4eabd702ea246e9c5')}\n",
"{'_id': ObjectId('69fda3a4eabd702ea246e9c9'), 'name': 'Gloria', 'species': 'Giraffe', 'zookeeper_id': ObjectId('69fda3a4eabd702ea246e9c6')}\n",
"{'_id': ObjectId('69fdaabeeabd702ea246e9cb'), 'name': 'Ella', 'species': 'elephant'}\n"
]
}
],
"execution_count": 39
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Teilaufgabe 1 (4 Punkte): \n",
"\n",
"Fügen Sie im folgenden Dokumente ein, die die selben Informationen enthalten wie in der Aufgabe zuvor. Dabei sollen drei Tiere mit zwei Tierpfegern erstellt werden. Ein Tierpfleger versorgt mehrere Tiere, jedes Tier ist genau einem Tierpfleger zugeordnet. Ob Sie die Daten dabei normalisieren oder nicht, bleibt Ihnen überlassen."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:20:04.598013716Z",
"start_time": "2026-05-08T09:20:04.557642811Z"
}
},
"source": [
"# Aufräumen\n",
"db.zookeepers.drop()\n",
"db.animals.drop()\n",
"\n",
"# Tierpfleger hinzufügen\n",
"john_id = db.zookeepers.insert_one(\n",
" {\n",
" \"name\": \"John Doe\",\n",
" \"email\": \"john@example.com\",\n",
" \"speciality\": \"Elephants\"\n",
" }\n",
").inserted_id\n",
"jane_id = db.zookeepers.insert_one(\n",
" {\n",
" \"name\": \"Jane Doe\",\n",
" \"email\": \"jane@example.com\",\n",
" \"speciality\": \"Giraffes\"\n",
" }\n",
").inserted_id\n",
"\n",
"# Tiere hinzufügen\n",
"db.animals.insert_many([\n",
" {\n",
" \"name\": \"Babar\",\n",
" \"species\": \"Elephant\",\n",
" \"zookeeper_id\": john_id\n",
" },\n",
" {\n",
" \"name\": \"Dumbo\",\n",
" \"species\": \"Elephant\",\n",
" \"zookeeper_id\": john_id\n",
" },\n",
" {\n",
" \"name\": \"Gloria\",\n",
" \"species\": \"Giraffe\",\n",
" \"zookeeper_id\": jane_id\n",
" },\n",
"])"
],
"outputs": [
{
"data": {
"text/plain": [
"InsertManyResult([ObjectId('69fdaac4eabd702ea246e9ce'), ObjectId('69fdaac4eabd702ea246e9cf'), ObjectId('69fdaac4eabd702ea246e9d0')], acknowledged=True)"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Teilaufgabe 2 (3 Punkte): \n",
"\n",
"Erstellen Sie jetzt noch eine Funktion, die einen Überblick über alle Tiere im Zoo gibt, die Ausgabe soll dabei dem Beispiel ähneln."
]
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:20:07.632673893Z",
"start_time": "2026-05-08T09:20:07.598404039Z"
}
},
"source": [
"def zoo_overview():\n",
" result = db.animals.aggregate([\n",
" {\n",
" \"$lookup\": {\n",
" \"from\": \"zookeepers\",\n",
" \"localField\": \"zookeeper_id\",\n",
" \"foreignField\": \"_id\",\n",
" \"as\": \"zookeeper\"\n",
" }\n",
" },\n",
" {\n",
" \"$project\": {\n",
" \"name\": 1,\n",
" \"species\": 1,\n",
" \"zookeeper_name\": \"$zookeeper.name\"\n",
" }\n",
" },\n",
" {\n",
" \"$unwind\": \"$zookeeper_name\",\n",
" }\n",
" ])\n",
"\n",
" animals = []\n",
"\n",
" for animal in result:\n",
" animals.append(animal)\n",
"\n",
" col_widths = (\n",
" max([len(animal.get(\"name\")) for animal in animals]),\n",
" max([len(animal.get(\"species\")) for animal in animals]),\n",
" max([len(animal.get(\"zookeeper_name\")) for animal in animals]),\n",
" )\n",
"\n",
" print(\"-\" * (sum(col_widths) + 10))\n",
" for animal in animals:\n",
" print(f\"| {animal.get(\"name\"):{col_widths[0]}} | {animal.get(\"species\"):{col_widths[1]}} | {animal.get(\"zookeeper_name\"):{col_widths[2]}} |\")\n",
" print(\"-\" * (sum(col_widths) + 10))\n",
"\n",
"# Beispielausgabe:\n",
"# \n",
"# ----------------------------------------\n",
"# | Babar | Elephant | John Doe |\n",
"# | Dumbo | Elephant | John Doe |\n",
"# | Hathi | Elephant | John Doe |\n",
"# | Melman | Giraffe | Jane Doe |\n",
"# | Gloria | Giraffe | Jane Doe |\n",
"# ----------------------------------------\n",
"\n",
"# Testaufruf\n",
"zoo_overview()"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------\n",
"| Babar | Elephant | John Doe |\n",
"| Dumbo | Elephant | John Doe |\n",
"| Gloria | Giraffe | Jane Doe |\n",
"--------------------------------\n"
]
}
],
"execution_count": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Teilaufgabe 3 (3 Punkte): \n",
"\n",
"Begründen Sie, warum Sie die Struktur der Datenbank so gewählt haben, wie Sie es getan haben. \n",
"\n",
"Welche Vor- und Nachteile hat Ihre Lösung (für volle Punktzahl sollten Sie mindestens 2 Vor- und 2 Nachteile nennen)?\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Die Datenbank wurde mit zwei getrennten Collections (zookeepers und animals) umgesetzt, wobei Tiere über eine zookeeper_id auf ihren Tierpfleger verweisen (Referenzierung). Alternativ hätte man die Tiere direkt als Array in das Tierpfleger-Dokument einbetten können (Embedding). Die Referenzierung wurde gewählt, da Tiere auch unabhängig von ihrem Tierpfleger abgefragt werden sollen und die Tierliste potenziell sehr gross werden kann. Embedding würde dabei zu sehr grossen Dokumenten führen.\n",
"\n",
"Vorteile:\n",
"Tiere können unabhängig von Tierpflegern abgefragt und aktualisiert werden, ohne das gesamte Tierpfleger-Dokument zu laden\n",
"Skalierbar: Auch bei vielen Tieren pro Tierpfleger wächst das Tierpfleger-Dokument nicht an (MongoDB hat ein 16 MB Dokumentlimit)\n",
"\n",
"Nachteile:\n",
"MongoDB erzwingt keine referentielle Integrität: Ein Tier kann eine zookeeper_id referenzieren, die nicht existiert, ohne dass ein Fehler auftritt\n",
"Abfragen, die Daten aus beiden Collections kombinieren (z. B. „alle Tiere mit Tierpfleger-Name\"), erfordern $lookup-Aggregationen, was im Vergleich zu einem SQL-JOIN aufwändiger ist (In Teilaufgabe 2 zu sehen)."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:base] *",
"language": "python",
"name": "conda-base-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -13,32 +13,57 @@
},
{
"cell_type": "code",
"execution_count": 140,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:17:37.945734700Z",
"start_time": "2026-05-08T09:17:37.898267121Z"
}
},
"source": [
"import psycopg2\n",
"import psycopg2.extras"
]
"import psycopg2.extras\n",
"import json"
],
"outputs": [],
"execution_count": 15
},
{
"cell_type": "code",
"execution_count": 141,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:17:54.987395691Z",
"start_time": "2026-05-08T09:17:54.967699370Z"
}
},
"source": [
"# Verbindung aufbauen\n",
"# TODO: hier müssen Ihre Verbindungsdaten eingetragen werden\n",
"# TODO: ggf. müssen Sie auch den Namen der Datenbank anpassen oder eine leere Datenbank 'zoo' anlegen\n",
"conn = psycopg2.connect(\"dbname=zoo host=/var/run/postgresql user=postgres password=sml12345\")"
]
"def get_connection():\n",
" with open(\"../.db_config.json\") as f:\n",
" cfg = json.load(f)\n",
"\n",
" conn = psycopg2.connect(\n",
" host = cfg[\"host\"],\n",
" port = cfg[\"port\"],\n",
" dbname = \"zoo\",\n",
" user = cfg[\"user\"],\n",
" password = cfg[\"password\"],\n",
" )\n",
" return conn"
],
"outputs": [],
"execution_count": 16
},
{
"cell_type": "code",
"execution_count": 142,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:17:56.651002558Z",
"start_time": "2026-05-08T09:17:56.616450554Z"
}
},
"source": [
"conn = get_connection()\n",
"\n",
"# Diese Zelle löscht die Tabellen, falls sie bereits existieren, und legt sie neu an\n",
"sql = \"\"\"\n",
" DROP TABLE IF EXISTS animals;\n",
@ -64,17 +89,19 @@
"cur = conn.cursor()\n",
"cur.execute(sql)\n",
"conn.commit()\n"
]
],
"outputs": [],
"execution_count": 17
},
{
"cell_type": "code",
"execution_count": 143,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:17:58.961644024Z",
"start_time": "2026-05-08T09:17:58.949110338Z"
}
},
"source": [
"# TODO: Implementieren Sie hier die CRUD-Operationen für Zookeeper\n",
"\n",
"# TODO: Tierpleger anlegen, liefert die ID des neuen Tierpflegers zurück\n",
"def create_zookeeper(name, email, specialty):\n",
" try:\n",
" cur.execute(\"\"\"\n",
@ -87,18 +114,15 @@
" except:\n",
" conn.rollback()\n",
"\n",
"# TODO: Tierpfleger nach ID lesen, Tupel zurückgeben\n",
"def read_zookeeper(id):\n",
" cur.execute(\"SELECT * FROM zookeepers where id=%s\", (id,))\n",
" zookeeper = cur.fetchone()\n",
" return tuple(zookeeper) if zookeeper else None\n",
"\n",
"# TODO: Alle Tierpfleger lesen, liefert eine Liste von Tupeln zurück (nach ID sortiert)\n",
"def read_all_zookeepers():\n",
" cur.execute(\"SELECT * FROM zookeepers order by id\")\n",
" return [(zookeeper) for zookeeper in cur.fetchall()]\n",
"\n",
"# TODO: Tierpfleger aktualisieren\n",
"def update_zookeeper(id, name, email, specialty):\n",
" try:\n",
" cur.execute(\"\"\"\n",
@ -110,7 +134,6 @@
" except:\n",
" conn.rollback()\n",
"\n",
"# TODO: Tierpfleger per ID löschen\n",
"def delete_zookeeper(id):\n",
" try:\n",
" cur.execute(\"\"\"\n",
@ -121,13 +144,18 @@
" except:\n",
" conn.rollback()\n",
" raise"
]
],
"outputs": [],
"execution_count": 18
},
{
"cell_type": "code",
"execution_count": 144,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:18:01.926507382Z",
"start_time": "2026-05-08T09:18:01.895838996Z"
}
},
"source": [
"# Tests - diese sollten alle erfolgreich durchlaufen werden und nicht verändert werden\n",
"\n",
@ -156,7 +184,9 @@
"\n",
"all_zookeepers = read_all_zookeepers()\n",
"assert len(all_zookeepers) == 0"
]
],
"outputs": [],
"execution_count": 19
},
{
"cell_type": "markdown",
@ -173,9 +203,12 @@
},
{
"cell_type": "code",
"execution_count": 145,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:23.034281307Z",
"start_time": "2026-05-08T09:19:22.981802943Z"
}
},
"source": [
"## Nutzung von SQLAlchemy\n",
"from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, select\n",
@ -199,9 +232,12 @@
" zookeeper_id = Column(Integer, ForeignKey('zookeepers.id'))\n",
" zookeeper = relationship(\"Zookeeper\", back_populates=\"animals\")\n",
"\n",
"# TODO: Verbingung zur Datenbank herstellen\n",
"engine = create_engine('postgresql://postgres:sml12345@localhost/zoo') "
]
"with open(\"../.db_config.json\") as f:\n",
" cfg = json.load(f)\n",
"engine = create_engine(f'postgresql://{cfg[\"user\"]}:{cfg[\"password\"]}@{cfg[\"host\"]}/zoo')"
],
"outputs": [],
"execution_count": 21
},
{
"cell_type": "markdown",
@ -224,23 +260,36 @@
},
{
"cell_type": "code",
"execution_count": 146,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:25.146660428Z",
"start_time": "2026-05-08T09:19:25.113939045Z"
}
},
"source": [
"# TODO: zwei Zookeeper anlegen\n",
"with Session(engine) as session:\n",
" with session.begin():\n",
" john = Zookeeper(name=\"John Doe\", email=\"john@example.com\", specialty=\"Elephants\")\n",
" jane = Zookeeper(name=\"Jane Doe\", email=\"jane@example.com\", specialty=\"Giraffes\")\n",
" \n",
" session.add_all([john, jane])"
]
],
"outputs": [],
"execution_count": 22
},
{
"cell_type": "code",
"execution_count": 147,
"metadata": {},
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:26.787406980Z",
"start_time": "2026-05-08T09:19:26.754820181Z"
}
},
"source": [
"with Session(engine) as session:\n",
" statement = select(Zookeeper.name)\n",
" print(session.scalars(statement).all())"
],
"outputs": [
{
"name": "stdout",
@ -250,20 +299,17 @@
]
}
],
"source": [
"# TODO: Alle Zookeeper ausgeben\n",
"with Session(engine) as session:\n",
" statement = select(Zookeeper.name)\n",
" print(session.scalars(statement).all())"
]
"execution_count": 23
},
{
"cell_type": "code",
"execution_count": 148,
"metadata": {},
"outputs": [],
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:28.186994306Z",
"start_time": "2026-05-08T09:19:28.158814205Z"
}
},
"source": [
"# TODO: 3 Elefanten anlegen, die John betreut\n",
"with Session(engine) as session:\n",
" with session.begin():\n",
" john_clause = select(Zookeeper.id).where(Zookeeper.name.like(\"%John%\"))\n",
@ -271,34 +317,24 @@
"\n",
" session.add_all([Animal(name=animal, species=\"Elephant\", zookeeper_id=john_id) for animal in [\"Babar\", \"Dumbo\", \"Hathi\"]])\n",
" \n",
"# TODO: 2 Giraffen anlegen, die Jane betreut\n",
"with Session(engine) as session:\n",
" with session.begin():\n",
" jane_clause = select(Zookeeper.id).where(Zookeeper.name.like(\"%Jane%\"))\n",
" jane_id = session.scalars(jane_clause).first()\n",
" \n",
" session.add_all([Animal(name=animal, species=\"Giraffe\", zookeeper_id=jane_id) for animal in [\"Melman\", \"Gloria\"]])"
]
],
"outputs": [],
"execution_count": 24
},
{
"cell_type": "code",
"execution_count": 149,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------\n",
"| Babar | Elephant | John Doe |\n",
"| Dumbo | Elephant | John Doe |\n",
"| Hathi | Elephant | John Doe |\n",
"| Melman | Giraffe | Jane Doe |\n",
"| Gloria | Giraffe | Jane Doe |\n",
"--------------------------------\n"
]
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:19:31.605124061Z",
"start_time": "2026-05-08T09:19:31.570527613Z"
}
],
},
"source": [
"# Liste aller Tiere mit ihren Pflegern ausgeben:\n",
"with Session(engine) as session:\n",
@ -327,7 +363,23 @@
"# | Gloria | Giraffe | Jane Doe |\n",
"# ----------------------------------------\n",
"\n"
],
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"--------------------------------\n",
"| Babar | Elephant | John Doe |\n",
"| Dumbo | Elephant | John Doe |\n",
"| Hathi | Elephant | John Doe |\n",
"| Melman | Giraffe | Jane Doe |\n",
"| Gloria | Giraffe | Jane Doe |\n",
"--------------------------------\n"
]
}
],
"execution_count": 25
},
{
"cell_type": "code",

View File

@ -34,30 +34,14 @@
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:20.768652Z",
"start_time": "2026-04-19T20:28:20.766464Z"
"end_time": "2026-05-08T09:14:24.343076987Z",
"start_time": "2026-05-08T09:14:24.295839168Z"
}
},
"source": [
"import psycopg2\n",
"import psycopg2.extras"
],
"outputs": [],
"execution_count": 26
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:21.151712Z",
"start_time": "2026-04-19T20:28:21.149462Z"
}
},
"source": [
"# Datenbankverbindung herstellen\n",
"def get_connection():\n",
" conn = psycopg2.connect(\"dbname=seminar user=postgres password=sml12345\")\n",
" return conn"
"import psycopg2.extras\n",
"import json"
],
"outputs": [],
"execution_count": 27
@ -66,8 +50,34 @@
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:37.424939Z",
"start_time": "2026-04-19T20:28:37.390822Z"
"end_time": "2026-05-08T09:16:21.669826753Z",
"start_time": "2026-05-08T09:16:21.619864463Z"
}
},
"source": [
"# Datenbankverbindung herstellen\n",
"def get_connection():\n",
" with open(\"../.db_config.json\") as f:\n",
" cfg = json.load(f)\n",
"\n",
" conn = psycopg2.connect(\n",
" host = cfg[\"host\"],\n",
" port = cfg[\"port\"],\n",
" dbname = \"seminar\",\n",
" user = cfg[\"user\"],\n",
" password = cfg[\"password\"],\n",
" )\n",
" return conn"
],
"outputs": [],
"execution_count": 30
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-05-08T09:16:33.438175778Z",
"start_time": "2026-05-08T09:16:33.403839630Z"
}
},
"source": [
@ -96,14 +106,14 @@
"conn.commit()"
],
"outputs": [],
"execution_count": 33
"execution_count": 32
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:22.178605Z",
"start_time": "2026-04-19T20:28:22.174509Z"
"end_time": "2026-05-08T09:16:36.121786269Z",
"start_time": "2026-05-08T09:16:36.105075314Z"
}
},
"source": [
@ -151,14 +161,14 @@
]
}
],
"execution_count": 29
"execution_count": 33
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:22.832360Z",
"start_time": "2026-04-19T20:28:22.829458Z"
"end_time": "2026-05-08T09:16:38.572787114Z",
"start_time": "2026-05-08T09:16:38.553774280Z"
}
},
"source": [
@ -180,14 +190,14 @@
" \n"
],
"outputs": [],
"execution_count": 30
"execution_count": 34
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:23.903374Z",
"start_time": "2026-04-19T20:28:23.900910Z"
"end_time": "2026-05-08T09:16:40.473081864Z",
"start_time": "2026-05-08T09:16:40.456512466Z"
}
},
"source": [
@ -209,14 +219,14 @@
" print(\"Session\", random_session_id, \"ist ausgebucht\")"
],
"outputs": [],
"execution_count": 31
"execution_count": 35
},
{
"cell_type": "code",
"metadata": {
"ExecuteTime": {
"end_time": "2026-04-19T20:28:40.301148Z",
"start_time": "2026-04-19T20:28:40.248650Z"
"end_time": "2026-05-08T09:16:42.460764216Z",
"start_time": "2026-05-08T09:16:42.380979803Z"
}
},
"source": [
@ -273,117 +283,117 @@
"Gesamt: 40\n",
"Platzanzahl ist konsistent!\n",
"--------------------\n",
"User 50 hat sich für Session 2 angemeldet\n",
"User 42 hat sich für Session 5 angemeldet\n",
"User 59 hat sich für Session 5 angemeldet\n",
"User 33 hat sich für Session 8 angemeldet\n",
"User 6 hat sich für Session 2 angemeldet\n",
"User 30 hat sich für Session 3 angemeldet\n",
"User 14 hat sich für Session 5 angemeldet\n",
"User 75 hat sich für Session 1 angemeldet\n",
"User 44 hat sich für Session 8 angemeldet\n",
"User 42 hat sich für Session 5 angemeldet\n",
"User 87 hat sich für Session 7 angemeldet\n",
"User 44 hat sich für Session 4 angemeldet\n",
"User 87 hat sich für Session 2 angemeldet\n",
"User 64 hat sich für Session 2 angemeldet\n",
"User 83 hat sich für Session 1 angemeldet\n",
"User 54 hat sich für Session 1 angemeldet\n",
"User 47 hat sich für Session 3 angemeldet\n",
"User 23 hat sich für Session 1 angemeldet\n",
"Session 2 ist ausgebucht\n",
"User 91 hat sich für Session 4 angemeldet\n",
"User 22 hat sich für Session 3 angemeldet\n",
"Session 2 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"User 86 hat sich für Session 3 angemeldet\n",
"User 36 hat sich für Session 4 angemeldet\n",
"User 80 hat sich für Session 8 angemeldet\n",
"User 45 hat sich für Session 8 angemeldet\n",
"User 51 hat sich für Session 2 angemeldet\n",
"User 62 hat sich für Session 7 angemeldet\n",
"User 90 hat sich für Session 5 angemeldet\n",
"User 96 hat sich für Session 6 angemeldet\n",
"User 97 hat sich für Session 7 angemeldet\n",
"User 18 hat sich für Session 3 angemeldet\n",
"User 61 hat sich für Session 4 angemeldet\n",
"User 96 hat sich für Session 3 angemeldet\n",
"User 92 hat sich für Session 7 angemeldet\n",
"User 34 hat sich für Session 4 angemeldet\n",
"User 48 hat sich für Session 7 angemeldet\n",
"User 43 hat sich für Session 1 angemeldet\n",
"User 23 hat sich für Session 4 angemeldet\n",
"User 36 hat sich für Session 6 angemeldet\n",
"User 71 hat sich für Session 8 angemeldet\n",
"User 88 hat sich für Session 3 angemeldet\n",
"Session 8 ist ausgebucht\n",
"User 29 hat sich für Session 1 angemeldet\n",
"User 51 hat sich für Session 4 angemeldet\n",
"Session 8 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"User 91 hat sich für Session 5 angemeldet\n",
"User 62 hat sich für Session 4 angemeldet\n",
"User 1 hat sich für Session 3 angemeldet\n",
"User 98 hat sich für Session 2 angemeldet\n",
"User 45 hat sich für Session 7 angemeldet\n",
"User 20 hat sich für Session 2 angemeldet\n",
"Session 7 ist ausgebucht\n",
"User 76 hat sich für Session 3 angemeldet\n",
"Session 7 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"User 75 hat sich für Session 5 angemeldet\n",
"User 75 hat sich für Session 2 angemeldet\n",
"Session 2 ist ausgebucht\n",
"User 61 hat sich für Session 1 angemeldet\n",
"Session 8 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"User 94 hat sich für Session 6 angemeldet\n",
"Session 4 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"User 5 hat sich für Session 1 angemeldet\n",
"User 81 hat sich für Session 5 angemeldet\n",
"Session 7 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"User 1 hat sich für Session 8 angemeldet\n",
"Session 1 ist ausgebucht\n",
"User 3 hat sich für Session 4 angemeldet\n",
"User 85 hat sich für Session 7 angemeldet\n",
"Session 8 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"User 32 hat sich für Session 6 angemeldet\n",
"Session 3 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"User 29 hat sich für Session 3 angemeldet\n",
"User 58 hat sich für Session 6 angemeldet\n",
"User 75 hat sich für Session 7 angemeldet\n",
"User 50 hat sich für Session 4 angemeldet\n",
"Session 2 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"User 99 hat sich für Session 6 angemeldet\n",
"User 82 hat sich für Session 7 angemeldet\n",
"Session 3 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 1 ist ausgebucht\n",
"Session 1 ist ausgebucht\n",
"User 67 hat sich für Session 6 angemeldet\n",
"Session 5 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"User 53 hat sich für Session 7 angemeldet\n",
"Session 3 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"User 34 hat sich für Session 6 angemeldet\n",
"Session 2 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 1 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"User 12 hat sich für Session 6 angemeldet\n",
"Session 4 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"User 68 hat sich für Session 6 angemeldet\n",
"Session 5 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"User 18 hat sich für Session 6 angemeldet\n",
"Session 3 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"User 56 hat sich für Session 6 angemeldet\n",
"Session 1 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 7 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 3 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 4 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"Session 1 ist ausgebucht\n",
"User 88 hat sich für Session 6 angemeldet\n",
"Session 7 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 5 ist ausgebucht\n",
"Session 8 ist ausgebucht\n",
"User 42 hat sich für Session 6 angemeldet\n",
"Session 3 ist ausgebucht\n",
"Session 2 ist ausgebucht\n",
"User 28 hat sich für Session 6 angemeldet\n",
"Session 8 ist ausgebucht\n",
"Nach dem Lasttest:\n",
"--------------------\n",
"Freie Plätze: 0\n",
"Belegte Plätze: 40\n",
"Freie Plätze: 4\n",
"Belegte Plätze: 36\n",
"Gesamt: 40\n",
"Platzanzahl ist konsistent!\n",
"--------------------\n"
]
}
],
"execution_count": 34
"execution_count": 36
},
{
"metadata": {},
@ -395,9 +405,9 @@
],
"metadata": {
"kernelspec": {
"display_name": "base",
"display_name": "Python [conda env:base] *",
"language": "python",
"name": "python3"
"name": "conda-base-py"
},
"language_info": {
"codemirror_mode": {