2024-10-02
DuckDB in Python im Browser mit Pyodide, PyScript und JupyterLite
Alex Monahan
{::nomarkdown}
{:/nomarkdown}
Zeit bis „Hello World“
Wenn Sie eine neue Bibliothek zum ersten Mal nutzen, zählt vor allem, wie schnell Sie zu „Hello World“ kommen.
Hinweis: Wollen Sie „Hello World“ sehen? Springen Sie zu den vollständig interaktiven Beispielen!
Ebenso möchten Sie, wenn jemand Ihre Dokumentation besucht, dass das Tool schnell und einfach läuft. Bei einer Demo wollen Sie „Demo Hell“ vermeiden und dass es beim ersten Versuch klappt!
Wollen Sie den „Expertenmodus“, führen Sie einen ganzen Konferenzsaal durch diese Setup-Schritte! Im Klassenzimmer oder Workshop ist eine kugelsichere Installation noch wichtiger.
Python ist eine unserer liebsten Arten, DuckDB zu nutzen, aber Python ist berüchtigt schwer einzurichten – erst recht für Einsteiger. Was zum Teufel ist eine virtuelle Umgebung? Windows, Linux oder Mac? Pip oder Conda? Der Neue auf dem Block, uv?
Erfahrene Pythonistas sind nicht immun! Viele, wie ich, mussten die ehrwürdige und von xkcd verewigte Tradition feiern, einfach alles Python-bezogene zu löschen und von vorn zu beginnen.
Wie machen wir es so einfach und schnell wie möglich, DuckDB in Python auszuprobieren?
Schwierigkeiten von Server-seitigem Python
Eine Antwort auf diese Herausforderung ist, für jeden Nutzer eine Python-Umgebung auf einem Server zu hosten. Das hat eine Reihe von Problemen.
Python selbst zu hosten ist nicht umsonst. Bei vielen Nutzern kann es weit von umsonst entfernt sein.
Wollen Sie eine kostenlose Lösung wie Google Colab nutzen, braucht jeder Besucher ein Google-Konto, und Sie müssen damit leben, dass Google auf Ihre Daten zugreift. Außerdem ist die Einbettung in eine bestehende Webseite für ein nahtloses Erlebnis schwierig.
Pyodide betritt die Bühne
Pyodide führt Python dank WebAssembly direkt im Browser aus – ohne Installation und ohne Setup. Das ist der einfachste und schnellste Weg zu einer Python-Umgebung: einfach eine Webseite laden! Die gesamte Berechnung läuft lokal, deshalb lässt sich das wie jede statische Website ausliefern, etwa mit GitHub Pages. Kein Server-seitiges Python nötig!
Ein weiterer Vorteil: Pyodide ist im Browser schön sandboxed. Jeder Nutzer bekommt seinen eigenen Workspace, und weil alles lokal ist, ist es schön sicher.
Was Pyodide von anderen In-Browser-Python-Ansätzen unterscheidet: Es kann sogar Bibliotheken ausführen, die in C, C++ oder Fortran geschrieben sind – einschließlich eines Großteils des Python-Data-Science-Stacks. Damit können Sie DuckDB jetzt auch in Pyodide nutzen! Sie können es sogar mit NumPy, SciPy und Pandas kombinieren (zusätzlich zu vielen reinen Python-Bibliotheken). PyArrow und Ibis haben ebenfalls experimentelle Unterstützung.
Anwendungsfälle für Pyodide-DuckDB
Wollen Sie Remote-Daten schnell mit Python oder DuckDB analysieren?
Pyodide ist der schnellste Weg, Ihre Fragen mit Python zu beantworten.
Wollen Sie lokale Daten schnell analysieren?
Pyodide kann auch lokale Dateien abfragen!
Wollen Sie Ihre Dokumentation interaktiv machen?
Lassen Sie Ihre Nutzer Ihre DuckDB-gestützte Bibliothek einfach ausprobieren.
Unten ein Beispiel, das das Jupyter-Plugin magic-duckdb für SQL-Zellen zeigt.
Leiten Sie eine Schulung mit DuckDB und Python?
Überspringen Sie den Ärger der lokalen Installation. Sie müssen nicht 1:1 mit den 15 % im Publikum arbeiten, die ein skurriles Setup haben! Alle bekommen das beim ersten Versuch in Sekunden hin, und Sie können zum eigentlichen Inhalt kommen. Außerdem ist es kostenlos, ohne Anmeldung irgendwelcher Art!
Pyodide-Beispiele
Wir zeigen mehrere Wege, Pyodide-gestütztes Python direkt in Ihre Site einzubetten, damit Ihre Nutzer Ihr neues DuckDB-basiertes Tool mit einem Klick ausprobieren können!
- PyScript-Editor: Ein Editor mit schöner Syntaxhervorhebung
- JupyterLite-Notebook: Eine klassische Notebook-Umgebung
- JupyterLite-Lab-IDE: Eine vollständige Entwicklungsumgebung
PyScript-Editor
Dieses HTML-Snippet bettet einen ausführbaren PyScript-Editor in jede Seite ein!
<script type="module" src="https://pyscript.net/releases/2024.8.2/core.js"></script><script type="py-editor" config='{"packages":["duckdb"]}'> import duckdb print(duckdb.sql("SELECT '42 in an editor' AS s").fetchall())</script>Klicken Sie einfach auf Play, und Sie können eine DuckDB-Query direkt im Browser ausführen. Sie können den Code bearbeiten, Zeilen hinzufügen usw. Probieren Sie es aus!
{::nomarkdown}
{:/nomarkdown}
JupyterLite-Notebook
Hier ein Beispiel mit einem iframe, der auf eine JupyterLite-Umgebung zeigt, die auf GitHub Pages bereitgestellt wurde!
<iframe src="https://alex-monahan.github.io/jupyterlite_duckdb_demo/notebooks/index.html?path=hello_duckdb.ipynb" style="height: 600px; width: 100%;"></iframe>Das ist eine vollständig interaktive Python-Notebook-Umgebung mit DuckDB darin. Führen Sie es gern aus!
{::nomarkdown}
{:/nomarkdown}
Eine vollständige JupyterLite-Umgebung einzurichten, dauert nur ein paar Schritte! Die JupyterLite-Leute haben eine Demo-Seite als Vorlage gebaut und eine gute Dokumentation. Die Hauptschritte:
- Mit der JupyterLite-Demo-Vorlage ein eigenes Repo anlegen
- GitHub Pages für das Repo aktivieren
- Eine .ipynb-Datei im Ordner
contenthinzufügen und committen https://⟨your_github_username⟩.github.io/⟨YOUR_REPOSITORY_NAME⟩/notebooks/index.html?path=⟨your_notebook_name⟩.ipynb{:.language-sql .highlight} aufrufen
Das Deployment von GitHub Pages kann ein paar Minuten dauern. Den Fortschritt sehen Sie im Actions-Tab von GitHub.
JupyterLite-Lab-IDE
Nach den Schritten im JupyterLite-Notebook-Setup können Sie in der URL /notebooks/ durch /lab/ ersetzen und eine vollständige IDE-Erfahrung bekommen!
Dieses Format ist etwas schwerer in eine andere Seite einzubetten, aber großartig für interaktive Nutzung.
Dieses Beispiel nutzt die Jupyter-Erweiterung magic-duckdb, mit der wir SQL-Zellen mit %%dql anlegen können.
Folgen Sie diesem Link zur Lab-IDE-Oberfläche oder experimentieren Sie unten mit der Notebook-Variante.
<iframe src="https://alex-monahan.github.io/jupyterlite_duckdb_demo/notebooks/index.html?path=magic_duckdb.ipynb" style="height: 600px; width: 100%;"></iframe>{::nomarkdown}
{:/nomarkdown}
Architektur von DuckDB in Pyodide
Wie genau funktioniert DuckDB in Pyodide? Der DuckDB-Python-Client wird vollständig nach WebAssembly (Wasm) kompiliert. Das unterscheidet sich vom bestehenden Ansatz DuckDB Wasm, der nur die C++-Seite der Bibliothek kompiliert und sie mit einer JavaScript-API umhüllt. Beide Ansätze nutzen die Emscripten-Toolchain für die Wasm-Kompilierung. DuckDBs Designentscheidung, Abhängigkeiten zu vermeiden, und die Vorarbeit in DuckDB-Wasm haben es möglich gemacht, das in so kurzer Zeit zu bauen!
Das Pyodide-Team hat DuckDB in sein gehostetes Bibliotheks-Repository aufgenommen und DuckDB sogar in den CI/CD-Workflow aufgenommen.
Deshalb kann JupyterLite einfach %pip install duckdb ausführen, und PyScript DuckDB als Paket im Parameter py-editor config oder im Tag <py-config> angeben.
Pyodide lädt dann die Wasm-kompilierte Version der DuckDB-Bibliothek aus dem Pyodide-Repository.
Ein großes Dankeschön an das Pyodide-Team, darunter Hood Chatham und Gyeongjae Choi, sowie das Voltron-Data-Team um Phillip Cloud für die Führung dieser Arbeit.
Einschränkungen
Der Browser ist eine restriktivere Umgebung (aus Sicherheitsgründen), deshalb gibt es bei DuckDB in Pyodide einige Einschränkungen. Es gibt kein kostenloses Mittagessen!
- Einzelthread
- Pyodide beschränkt die Ausführung derzeit auf einen Thread
- Ein paar Extra-Schritte für Remote-Dateien
- Remote-Dateien kann DuckDB nicht direkt zugreifen
- Stattdessen die Dateien zuerst mit Pyodide lokal holen
- DuckDB-Wasm hat eigene Erweiterungen dafür, die im DuckDB-Python-Client fehlen
- Keine zur Laufzeit geladenen Erweiterungen
- Mehrere Erweiterungen sind automatisch enthalten:
parquet,json,icu,tpcdsundtpch.
- Mehrere Erweiterungen sind automatisch enthalten:
- Release-Kadenz an Pyodide ausgerichtet
- Zum Zeitpunkt des Schreibens steht duckdb-pyodide bei 1.0.0 statt 1.1.1
Fazit
Pyodide ist jetzt der schnellste Weg, Python und DuckDB zusammen zu nutzen! Der Ansatz skaliert auf beliebig viele Nutzer, weil Pyodides Berechnungen vollständig lokal laufen.
Wir haben gesehen, wie man Pyodide auf mehrere Arten in eine statische Site einbettet und Remote-Dateien liest.
Wenn Sie DuckDB in Pyodide spannend finden, kommen Sie gern zu uns auf Discord.
Im Kanal #show-and-tell können Sie der Community zeigen, was Sie gebaut haben.
Sie können auch das duckdb-pyodide-Repo erkunden und Issues melden.
Wir würden uns auch sehr über Hilfe bei zur Laufzeit geladenen Erweiterungen freuen – bitte melden Sie sich, wenn Sie helfen können!
Viel Spaß beim Quacken!