Zum Bereitstellen einer CSV-Datei im JSON-Format werden zwei Tools benötigt:

Die beiden Tools werden folgendermaßen installiert:

pip install datasette sqlite-utils

CSV vorbereiten

Mit sqlite-utils wird die CSV-Datei in eine Sqlite-Tabelle konvertiert. Dazu dient der folgende Aufruf.

sqlite-utils insert <DB-Name> <Tabellenname> <CSV-Datei> --csv --detect-types

<DB-Name> steht dabei für den Namen der SQLite-Datei. Sollte die angegebene SQLite-Datei zuvor nicht existieren, erstellt das Kommando diese. <Tabellenname> steht für den Namen der Tabelle, welche aus der CSV-Datei generiert wird. Die Option --csv gibt an, dass es sich um eine CSV-Datei handelt und --detect-types sorgt dafür, dass Typen wie z.B. Text, Integer, etc. automatisch erkannt werden. Sollte die CSV-Datei das Zeichen ; statt , zur Trennung nutzen, kann die Option --delimiter=";" zum Kommando hinzugefügt werden. Sollte die CSV-Datei bereits eine Spalte besitzen, welche die Daten eindeutig differenziert (eine Spalte mit primary keys), wie zum Beispiel eine ID, kann man mit dem Parameter --pk=<Spaltenname>, sqlite-utils mitteilen, diese Spalte als primary key zu verwenden, statt automatisch eine Spalte dafür anzulegen.

Weitere Informationen zum Importieren/Konvertieren einer CSV-Datei findet man in der Dokumentation zu sqlite-utils.

JSON bereitstellen

Nachdem die SQLite-Datei erstellt wurde, kann man sie mit Datasette lokal hosten. Die Daten können mit folgendem Befehl bereitgestellt werden.

datasette serve --cors <Dateiname/Verzeichnis>

Die Option --cors sorgt dafür, dass datasette den Header Access-Control-Allow-Origin: * setzt. Dadurch erlaubt der Browser einen Zugriff auf die Daten aus einer Elm-Frontend-Anwendung heraus. <Dateiname/Verzeichnis> steht für die SQLite-Datei oder ein Verzeichnis, das nur SQLite-Dateien enthält, welches man bereitstellen will. Der Befehl stellt eine Weboberfläche bereit, mit der man durch die Daten navigieren kann. Wenn die SQLite-Datei test_db heißt und die Tabelle test_tabelle, kann man zum Beispiel unter http://127.0.0.1:8001/test_db/test_tabelle diese Weboberfläche erreichen. Wenn man der URL .json?_shape=array anhängt, werden die Daten als JSON ausgeliefert. Unter der URL http://127.0.0.1:8001/test_db/test_tabelle.json?_shape=array erhält man zum Beispiel folgendes Ergebnis.

[
  {
    "rowid": 1,
    "test_feld1": "test1.1",
    "test_feld2": "test1.2"
  },
  {
    "rowid": 2,
    "test_feld1": "test2.1",
    "test_feld2": "test2.2"
  },
  {
    "rowid": 3,
    "test_feld1": "test3.1",
    "test_feld2": "test3.2"
  },
  {
    "rowid": 4,
    "test_feld1": "test4.1",
    "test_feld2": "test4.2"
  }
]

In diesem Beispiel hat die CSV-Datei keine Spalte mit IDs bereitgestellt, weshalb sqlite-utils eigenständig eine entsprechende Spalte hinzugefügt hat. Weitere JSON-Darstellungsarten werden in der Dokumentation von Datasette beschrieben.

Datasette verwendet standardmäßig Pagination und zeigt daher nur die ersten 100 Datensätze an. Der Response Header enthält einen Link in der Form <http://127.0.0.1:8001/test_db/test.json?_shape=array&_next=200>; rel="next", der angibt, unter welcher URL die nächste Seite erreichbar ist. Falls dieser Response Header nicht existiert, ist die letzte Seite der Daten erreicht.