Import der Exceldaten des “Let’s Meet”-Datenbankprojekts (LS Beispiellösung Teil 2)

https://oer-informatik.de/lets_meet-beispielloesung_import

https://bildung.social/@oerinformatik/110207682728246503

tl/dr; Dies ist der zweite Teil (Datenimport) einer Beispiellösung für die “Let’s Meet” Datenbank-Lernsituation. Aus der Excel-Datei wird ein SQL-Importscript erstellt, das in einen neuen Docker-Container importiert wird. Dieser Artikel basiert auf Teil 1 der Beispiellösung hier (Modellierung). (Zuletzt geändert am 23.05.2023)

Dieser Artikel ist Teil einer mehrteiligen Serie, in der

Allen Artikel enden mit einem SQL-Skript, mit dem Daten als Ausgangspunkt für die nächste Etappe genutzt werden können, falls es zu Problemen bei der Eigenentwicklung kam.

Ausgangslage

Die eigentliche Aufgabestellung der “Let’s Meet” Datenbank-Lernsituation kann hier nachgelesen werden. Voraussetzung für den in diesem Teil beschriebenen Import ist eine fertig modellierte Datenbank, die als SQL-DDL-Befehl vorliegt wie es in dem Vorgängerartikel (Teil 1: Modellierung) beschrieben ist. Sämtliche Tabellen lassen sich beispielsweise über die fertigen SQL-Skripte für PostgreSQL (hier) oder MariaDB (hier) erzeugen.

Vorbereitung des DB-Containers

Um den Datenbank-Container zu starten und direkt mit den richtigen Daten zu füllen benötigen wir ein leeres Verzeichnis, in dem lediglich das zuvor erstellte SQL-Skript (siehe Gitlab-Links oben) liegt. In der Bash und Powershell könnte das z.B. so aussehen:

Variante MariaDB (Anleitung zu MariaDB im Container hier):

Dieses SQL-Skript wird automatisch ausgeführt, wenn wir in diesem Ordner mit folgendem Befehl einen MariaDB-Container erzeugen und starten:

(unter Linux muss statt ${PWD}: mit runden Klammern $(pwd): geschrieben werden)

Wenn alles geklappt hat, dann sollte im Container die interaktive (-it) MariaDB-Kommandozeile (mariadb) geöffnet werden können:

Nach Eingabe des Passworts sieht das Prompt etwa wie folgt aus:

Mit der folgenden Abfolge von SQL-Befehlen können die vorhandenen Datenbanken ausgegeben werden, die frisch angelegte letsMeetMigrationScheme ausgewählt werden und deren Tabellen angezeigt werden:

Und dieser Befehl sollte zumindest eine leere Tabelle (Empty set (0.000 sec)) ausgeben:

Mit exit kann die SQL-Konsole wieder verlassen werden.

Weitere Details im Umgang mit MariaDB im Container und mit dem Zugriff eines Frontends finden sich hier.

Import in bestehende Struktur

Um die Ausgangsdaten in die SQL-Datenbank importieren zu können, müssen wir die einzelnen Werte aus dieser Excel-Datei importieren. Es gibt eine ganze Reihe Tools, die Excel-Tabellen in alle möglichen DBMS übernehmen - oft scheitern diese jedoch an Umlauten, Whitespaces, der Interpretation von Datumsfeldern, leeren Feldern usw.

Daher muss in jedem Fall am Ende des Imports überprüft werden, ob alle Werte übernommen wurden.

Um sicherzugehen, was importiert wird, kann das SQL-INSERT-Statement per Excel-Formel generiert werden. Excel Formeln können den Inhalt anderer Zellen wiedergeben. Gibt man in der Excel-Zelle I2 beispielsweise die Formel =A2 ein, so wird der Inhalt der Zelle A2 in I2 angezeigt. Zeichenketten werden in Excel mit & verknüpft, zudem können in Anführungszeichen weitere Zeichenketten eingegeben werden: ="1: "&A2&", 2:"&B2 fügt den Inhalt zweier Zellen aneinander.

Ziel soll es sein, aus einer Excel-Zeile ein SQL-INSERT-Statement zu erstellen nach dem Muster:

Besonderes Augenmerk sollte hierbei auf den Anführungszeichen liegen. Ich hatte oben doppelte Anführungszeichen zur Trennung der Werte verwendet ("Max"). In Excel trennen diese jedoch die Zeichenketten. Wir nutzen also für das SQL-Statement neben den doppelten Anführungszeichen zur Abtrennung der Excel-Zeichenketten zusätzlich die einfachen Anführungszeichen zur Abtrennung der Werte des Import-Befehls:

="INSERT INTO tblNamen (vorname, nachname) VALUES('"&A2&"','"&B2&"');"

Natürlich muss vorher überprüft werden, ob in den eingefügten Werten Anführungszeichen vorhanden sind, da sonst das SQL-Statement die Zeichenketten falsch interpretiert.

Damit ist die Grundstruktur der Formel gelegt, um aus einer Excel-Tabelle SQL-Befehle zu generieren. Eine Formel nach diesem Muster müsste also in eine freie Spalte (z.B. I2 in der Beispieltabelle) erstellt werden und dort die Werte und Attributnamen aller Spalten enthalten. Diese Formel müsste dann in alle Zeilen mit Werte kopiert werden. Die so erstellten SQL-Befehle können wiederum kopiert und in einem SQL-Frontend ausgeführt werden.

Prinzipiell gibt es die Möglichkeit, aus jeder Zeile einen einzelnen SQL-Befehl zu erstellen, etwa so:

Oder alle Werte in einem gemeinsamen Statement als Einzeiler zusammenzufassen:

Während die erste Variante den Vorteil hat, dass wir bei auftretenden Fehlern genau sehen, welches SQL-Statement einen Fehler verursacht, haben wir andererseits das Problem, dass ggf. nicht alle Befehle ausgeführt werden, ohne dass wir das merken.

Ich erstelle daher mehrzeilige SQL-Befehle zum Debuggen, den Import selbst führe ich aber mit einem Einzeiler durch, um sicherzugehen, dass alle Zeilen importiert werden (oder im Fehlerfall eben keine, was ich schnell merke).

Meine Mehrzeiler-Formel für die erste Wertzeile (Excel-Zeile 2), die ich in Zelle J2 eingefügt und nach unten kopiert habe, lautet:

="INSERT INTO letsMeetMigrationScheme.tblUrsprung (namen, adresse, telefon, hobbytext, email, geschlecht, interesse, geburtstag) VALUES('"&A2&"', '"&B2&"', '"&C2&"', '"&D2&"', '"&E2&"', '"&F2&"', '"&G2&"', '"&H2&"');"

Für den Einzeiler-Befehl benötige ich nur die Klammer mit dem Werten aus der obigen Formel, wobei die einzelnen Klammern mit Kommata getrennt werden:

="('"&A2&"', '"&B2&"', '"&C2&"', '"&D2&"', '"&E2&"', '"&F2&"', '"&G2&"', '"&H2&"'),"

Diese Wert-Zeilen werden dann später zu einem SQL-Statement ergänzt:

Wichtig ist, dass das letzte Komma gelöscht (bzw. durch einen Semikolon ersetzt) werden muss, da sonst der SQL-Befehl nicht durchläuft.

Keine Besonderheiten bei MariaDB - das Skript müsste so durchlaufen.

Keine Besonderheiten bei PostgreSQL - das Skript müsste so durchlaufen.

Testen des Imports

Um sicherzustellen, dass alle Daten importiert wurden, sollten wir zumindest rudimentäre Plausibilitätskontrollen vornehmen. Wurden alle Zeilen importiert? Wurden alle Zeichen importiert? Wir zählen in der Excel-Tabelle nach.

Spaltenweise lassen sich die Zeichen zählen z.B. über die Matrixfunktion (in Excel Formel eingeben, dann Strg-Shift-Return drücken):

=SUMME(LÄNGE(Tabelle1!A2:A1577))

(Für die anderen Spalten entsprechend)

Es ergeben sich folgende Testfälle, die sich leider durch unterschiedliche Abfragen und unterschiedliche Zählweise der DBMS in den Ergebnissen unterscheiden.

Testfall
Nr.
Beschreibender Name der Testklasse / des Testfalls Vor-
bedingungen
Eingabewerte Erwartetes
Resultat
gemäß
Spezifikation
Nach-
bedingungen
Tatsächliches
Resultat
bestanden
/ nicht bestanden
Import-1 Alle Zeilen importiert? SELECT COUNT(*) from letsMeetMigrationScheme.tblUrsprung; 1576 -
Import-2 Alle Namen importiert? SELECT SUM(CHAR_LENGTH(namen)) from letsMeetMigrationScheme.tblUrsprung; 24315 -
Import-3 Alle Adressen importiert? SELECT SUM(CHAR_LENGTH(adresse)) from letsMeetMigrationScheme.tblUrsprung; 52731 -
Import-4 Alle Telefonnummern importiert? SELECT SUM(CHAR_LENGTH(telefon)) from letsMeetMigrationScheme.tblUrsprung; 20021 -
Import-5 Alle Hobbys importiert? SELECT SUM(CHAR_LENGTH(hobbytext)) from letsMeetMigrationScheme.tblUrsprung; 174464 -
Import-6 Alle E-Mail-Adressen importiert? SELECT SUM(CHAR_LENGTH(email)) from letsMeetMigrationScheme.tblUrsprung; 40305 -
Import-7 Alle Geschlechter importiert? SELECT SUM(CHAR_LENGTH(geschlecht)) from letsMeetMigrationScheme.tblUrsprung; 1614 -
Import-8 Alle Interessen importiert? SELECT SUM(CHAR_LENGTH(interesse)) from letsMeetMigrationScheme.tblUrsprung; 1609 -
Import-9 Alle Geburtstage importiert? SELECT SUM(CHAR_LENGTH(geburtstag)) from letsMeetMigrationScheme.tblUrsprung; 15760 -
Testfall
Nr.
Beschreibender Name der Testklasse / des Testfalls Vor-
bedingungen
Eingabewerte Erwartetes
Resultat
gemäß
Spezifikation
Nach-
bedingungen
Tatsächliches
Resultat
bestanden
/ nicht bestanden
Import-1 Alle Zeilen importiert? SELECT COUNT(*) from letsMeetMigrationScheme.tblUrsprung; 1576 -
Import-2 Alle Namen importiert? SELECT SUM(LENGTH(namen)) from letsMeetMigrationScheme.tblUrsprung; 24321
MariaDB: 24315
-
Import-3 Alle Adressen importiert? SELECT SUM(LENGTH(adresse)) from letsMeetMigrationScheme.tblUrsprung; 52708 -
Import-4 Alle Telefonnummern importiert? SELECT SUM(LENGTH(telefon)) from letsMeetMigrationScheme.tblUrsprung; 20021 -
Import-5 Alle Hobbys importiert? SELECT SUM(LENGTH(hobbytext)) from letsMeetMigrationScheme.tblUrsprung; 176030 -
Import-6 Alle E-Mail-Adressen importiert? SELECT SUM(LENGTH(email)) from letsMeetMigrationScheme.tblUrsprung; 40305 -
Import-7 Alle Geschlechter importiert? SELECT SUM(LENGTH(geschlecht)) from letsMeetMigrationScheme.tblUrsprung; 1614 -
Import-8 Alle Interessen importiert? SELECT SUM(LENGTH(interesse)) from letsMeetMigrationScheme.tblUrsprung; 1609 -
Import-9 Alle Geburtstage importiert? SELECT SUM(LENGTH(geburtstag)) from letsMeetMigrationScheme.tblUrsprung; 15760 -

Fazit des Imports

Damit wären die Daten der Ausgangstabelle in tblUrsprung importiert. Ein fertiges SQL-Skript für

Natürlich muss vorher die Struktur angelegt werden, z.B. mit dem entsprechenden Skript aus Teil 1 der Beispiellösung (siehe oben oder in Teil 1).

Es fehlt noch die eigentliche Normalisierung im Bestand - das wird in einem weiteren Artikel beschrieben.

Alle Artikel der Beispiellösung

Dieser Artikel ist Teil einer mehrteiligen Serie, in der


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: Import der Exceldaten des "Let’s Meet"-Datenbankprojekts (LS Beispiellösung Teil 2)” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/lets_meet-beispielloesung_import veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/db-sql/lets-meet-db. Stand: 23.05.2023.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: