{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Informatische Werkzeuge in den Geistes- und Sozialwissenschaften II\n", "\n", "## Hausaufgabe 4 (Einführung in SQL-Datenbanken)\n", "\n", "**Erschienen:** 16.05.2020 \n", "**Abgabe bis:** 24.05.2020\n", "\n", "Bitte laden Sie Ihre Notebooks bis 23:59 Uhr am Abgabetag in Ihrer Übungsgruppe bei [StudOn](https://www.studon.fau.de) hoch.\n", "\n", "Wenn Ihnen einige der hier verwendeten Konzepte unbekannt sind oder Sie nicht wissen, wie Sie fortfahren sollen, können Sie die [Vorlesungsunterlagen](https://kwarc.info/teaching/IWGS/) zu Rate ziehen oder jederzeit Fragen im [Forum](https://www.studon.fau.de/studon/goto.php?target=frm_2920231) oder auf [Slack](https://join.slack.com/t/fauiwgs/shared_invite/enQtODIxNTA0OTA5MjE4LTRmNDBlODVmMTdmZWRkOWM2ODdmYmZmNTI1MTIxMTVjYjc2YWIxMzE0ZWFiYzZhNzMyMzZiMWRlNDJkODUwMDY) stellen, im [Tutorium](https://univis.fau.de/form?__s=2&dsc=anew/lecture_view&lvs=forsch/fokomp/izdihu/iwgstu&anonymous=1&ref=tlecture&sem=2020s&tdir=philos/digita/einfhr&__e=372) nachfragen, oder Ihrem Tutor eine Mail schreiben." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 4.1 (SQL Basics, 30 Punkte)\n", "\n", "Für die folgenden Aufgaben versetzen wir uns in die Situation, dass wir aus nicht näher genannten Gründen der nationalen Sicherheit, der nuklearen Abrüstung und dem Wohl der Wale im Atlantik gerne eine Datenbank von Nachahmungen beliebter Videospiele aufbauen möchten. Zunächst soll nur eine Tabelle darin enthalten sein, die ein paar Eckdaten für jedes Spiel enthält.\n", "\n", "**Aufgabe:** Schreiben Sie ein Python-Programm dass sich zur Datenbank `copycats.sqlite` verbindet (wenn diese Datenbank noch nicht existiert, wird sie automatisch erstellt). Danach soll Ihr Programm in dieser Datenbank eine Tabelle `Games` erstellen und füllen, die der folgenden Tabelle entspricht:\n", "\n", "| Title | Publisher | Year | Genre |\n", "|-----------------------------------|---------------|------|----------------------|\n", "| Critter Crossing: Latest Skylines | Yamauchi | 2020 | Social Sim |\n", "| Weird Life | Triangle Xine | 2015 | Graphic Adventure |\n", "| Group Castle 2 | Faucet | 2007 | First Person Shooter |\n", "\n", "Benutzen Sie dazu die SQL-Befehle `CREATE TABLE ();` und `INSERT INTO VALUES ();`. Verwenden Sie sinnvolle Datentypen für jede Zeile.\n", "\n", "*Anmerkung:* Denken Sie daran, dass Sie nach Ihren `INSERT`-Befehlen `.commit()` auf Ihrer Datenbankverbindung aufrufen müssen, damit die Änderungen an der Datenbank auch dauerhaft bleiben. Wenn die Tabellen in Ihrer Datenbank zwar existieren aber keinen Inhalt haben, haben Sie dies wahrscheinlich vergessen.\n", "\n", "*Anmerkung:* Wahrscheinlich werden Sie Ihr Python-Programm mehrmals ausführen, während Sie es entwickeln. Wenn allerdings in einer Datenbank eine Tabelle mit dem gleichen Namen schon existiert (z.B. aus dem vorherigen Durchlauf), tritt ein Fehler auf. Um diesen zu umgehen, können Sie bevor Sie die Tabelle erstellen den SQL-Befehl `DROP TABLE IF EXISTS ` ausführen. Dieser Befehl löscht eine gegebenenfalls vorhandene Tabelle." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Ihr Code hier! (Doppelklick zum Editieren, Shift + Enter um die Zelle auszuführen)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Anmerkung:* Sie können die Datenbank, die Ihr Code erstellt entweder hier auf JupyterLab mit der Konsole untersuchen (hilfreiche Befehle in der SQLite-Konsole, welche sie mit `sqlite3` starten können, sind z.B. `tables` oder `SELECT * FROM Games;`), oder sich die `.sqlite`-Datei auf Ihren eigenen Rechner downloaden und dort mittels eines [Database Browsers](https://sqlitebrowser.org/) inspizieren." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 4.2 (Ermittlungen, 40 Punkte)\n", "\n", "Nachdem Sie die Datenbank in Aufgabe 1 erstellt haben bekommen Sie nun vom Hauptquartier Informationen über einige Verdächtige an ihrer Universität zugesendet, die angeblich jeweils eins der genannten Spiele unter der Hand verkaufen sollen. Ihre Datenbank soll nun so erweitert werden, dass auch diese Informationen sinnig widergespiegelt werden. Dabei ist es dem Hauptquartier _extrem_ wichtig, dass keine Information unnötig doppelt gespeichert wird.\n", "\n", "**Aufgabe:** Erweitern Sie Ihren Python-Code aus der ersten Aufgabe so, dass die Tabelle `Games` nun einen Integer als Primary Key enthält, über den wir Einträge in dieser Tabelle referenzieren können:\n", "\n", "| GameID | Title | Publisher | Year | Genre |\n", "|:------:|-----------------------------------|---------------|------|----------------------|\n", "| 1 | Critter Crossing: Latest Skylines | Yamauchi | 2020 | Social Sim |\n", "| 2 | Weird Life | Triangle Xine | 2015 | Graphic Adventure |\n", "| 3 | Group Castle 2 | Faucet | 2007 | First Person Shooter |\n", "\n", "Erstellen Sie außerdem eine zweite Tabelle `Suspects`, die den Namen, das Geburtsdatum und die GameID der jeweiligen verdächtigten Person enthält. Die GameID soll hierbei ein Foreign Key sein, der den Primary Key der Tabelle `Games` referenziert.\n", "\n", "| Name | Birthday | GameID |\n", "|---------------------|------------|:------:|\n", "| Detlef Dreckamsteck | 04.04.2000 | 1 |\n", "| Marcus Mafiosi | 26.09.1999 | 3 |\n", "| Fatma Fantasiename | 11.12.2004 | 2 |\n", "| Finn Ferbrecher | 14.01.2001 | 2 |\n", "\n", "Hinweis: In den letzten Aufgabenblättern haben wir oft betont, dass Sie den Code aus früheren Zellen weiterverwenden können und sich damit Code-Duplizierung sparen können. Da wir hier das Layout der Tabelle aber ändern, empfehlen wir, einfach den Code von oben zu kopieren und dann entsprechend anzupassen." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Ihr Code hier! (Doppelklick zum Editieren, Shift + Enter um die Zelle auszuführen)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Aufgabe 4.3 (Feierabend, 30 Punkte)\n", "\n", "Uuuuund geschafft! Ab jetzt sollen sich die Behörden um alles Weitere kümmern, um diesem Videospielring das Handwerk zu legen.\n", "Jetzt haben Sie sich den Feierabend wirklich redlich verdie – In dem Moment poppt ein einkommender Videoanruf auf Ihrem Computerbildschirm auf.\n", "\n", "\"Hallo? Hier ist Malte Museumsdirektor. Wir kennen uns noch von damals, über Ädgar Ägyptologe, wissen Sie noch?\"\n", "\n", "Noch bevor Sie ihm erklären können, dass Sie wirklich müde sind und gerade vermutlich die Wale im Atlantik gerettet haben, erzählt er auch schon. Er hätte vor ein paar Wochen Beatrice Beispielperson eingestellt und sie beauftragt, eine Bilddatenbank zu programmieren. Beatrice hätte lange Probleme gehabt, aber letzte Woche hat dann plötzlich alles funktioniert! Beatrice hätte berichtet, sie hätte \"ein ganz klein wenig Hilfe\" von Ihnen bekommen.\n", "\n", "Jetzt ist Beatrice im Urlaub und Malte braucht dringend Hilfe bei einem wichtigen Feature Request, der kommende Projekte deutlich vereinfachen soll. Ob Sie ihm helfen können, fragt er.\n", "\n", "**Aufgabe:** In der letzten Woche haben wir den Inhalt von CSV-Dateien in eine Python-Liste gespeichert. Listen sind gut, aber wenn die Datenmengen groß werden, wird die Suche nach Datensätzen darin sehr ineffizient. \n", "Verwenden Sie den Code von letzter Woche, um die CSV-Datei _metadata.csv_ in eine neue SQL Datenbank _image_database.sqlite_ zu speichern. \n", "Das Vorgehen ist dabei größtenteils analog zu Teilaufgabe 4.1. Verbinden Sie sich zu einer neuen Datenbank und legen Sie eine Tabelle _Images_ an. Die Spalten können Sie dabei aus dem CSV übernehmen.\n", "Ihr Programm sollte automatisch jede CSV-Datei mit diesem Spaltenformat lesen können, auch wenn die Datei deutlich mehr Zeilen als die bisherige _metadata.csv_ hat. \n", "\n", "Da das Programm in dieser Woche nicht an Bottle geknüpft ist, können Sie Ihre Lösung direkt hier im Notebook in der nächsten Zelle implementieren." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Ihr Code hier! (Doppelklick zum Editieren, Shift + Enter um die Zelle auszuführen)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "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.8.0" } }, "nbformat": 4, "nbformat_minor": 4 }