Zum Inhalt springen

Fehlerbehebung

Fehlerbehebung

EXPLAIN gibt Zeilenumbrüche aus

In Python enthält die Ausgabe der Anweisung EXPLAIN harte Zeilenumbrüche (\n):

In [1]: import duckdb
...: duckdb.sql("EXPLAIN SELECT 42 AS x")
Out[1]:
┌───────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ explain_key │ explain_value │
│ varchar │ varchar │
├───────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ physical_plan │ ┌───────────────────────────┐\n│ PROJECTION │\n│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │\n│ x … │
└───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

Als Workaround können Sie die Ausgabe der Funktion explain() mit print ausgeben:

In [2]: print(duckdb.sql("SELECT 42 AS x").explain())
Out[2]:
┌───────────────────────────┐
│ PROJECTION │
│ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │
│ x │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│ DUMMY_SCAN │
└───────────────────────────┘

Bitte schauen Sie auch in die Jupyter-Anleitung für Tipps zur Verwendung von Jupyter mit JupySQL.

Abstürze und Fehler unter Windows

Beim Importieren von DuckDB unter Windows kann die Python-Laufzeitumgebung beim Import oder bei der ersten Verwendung abstürzen oder einen Fehler zurückgeben:

import duckdb
duckdb.sql("...")
Terminal window
ImportError: DLL load failed while importing duckdb: The specified module could not be found.
Terminal window
Windows fatal exception: access violation
Current thread 0x0000311c (most recent call first):
File "<stdin>", line 1 in <module>
Terminal window
Process finished with exit code -1073741819 (0xC0000005)

Die Ursache ist wahrscheinlich ein veraltetes Microsoft Visual C++ (MSVC) Redistributable-Paket. Die Lösung besteht darin, das neueste MSVC-Redistributable-Paket zu installieren. Alternativ können Sie pip anweisen, das Paket wie folgt aus dem Quellcode zu kompilieren:

Terminal window
python3 -m pip install duckdb --no-binary duckdb

Parametrisierte Abfragen in der relationalen API

Das Übergeben von Abfrageparametern an die Methoden sql(), query() oder from_query() verursacht einen erheblichen Leistungsaufwand. Derzeit gibt es in Core keinen Relationstyp, der Prepared Statements unterstützt, daher werden parametrisierte Abfragen sofort in eine Zwischendarstellung materialisiert. Das verursacht mindestens den 5-fachen Verarbeitungsaufwand und fast den doppelten Speicherverbrauch im Vergleich zum nicht parametrisierten Pfad.

Verwenden Sie stattdessen execute() für die parametrisierte Abfrage und führen Sie das Ergebnis anschließend über einen Replacement Scan in die relationale API ein:

import duckdb
conn = duckdb.connect()
# Use execute() for the parameterized query
df = conn.execute("SELECT * FROM my_table WHERE x = ?", [42]).df()
# Use a replacement scan to continue with the relational API
conn.sql("SELECT * FROM df WHERE y > 0").order("y").show()

Bekannte Probleme

Leider gibt es einige Probleme, die entweder außerhalb unseres Einflusses liegen oder sehr schwer greifbar bzw. nachzuvollziehen sind. Im Folgenden finden Sie eine Liste dieser Probleme, derer Sie sich je nach Arbeitsablauf bewusst sein sollten.

Numpy-Import bei Multithreading

Wenn Sie Multithreading nutzen und Ergebnisse entweder direkt als Numpy-Arrays oder indirekt über einen Pandas-DataFrame abrufen, kann es nötig sein sicherzustellen, dass numpy.core.multiarray importiert ist. Wenn dieses Modul nicht vom Hauptthread importiert wurde und ein anderer Thread zur Laufzeit versucht, es zu importieren, kommt es entweder zu einem Deadlock oder einem Absturz.

Um das zu vermeiden, wird empfohlen, import numpy.core.multiarray auszuführen, bevor Threads gestartet werden.

DESCRIBE und SUMMARIZE geben in Jupyter leere Tabellen zurück

Die Anweisungen DESCRIBE und SUMMARIZE geben eine leere Tabelle zurück:

%sql
CREATE OR REPLACE TABLE tbl AS (SELECT 42 AS x);
DESCRIBE tbl;

Als Workaround können Sie sie in eine Unterabfrage einbetten:

%sql
CREATE OR REPLACE TABLE tbl AS (SELECT 42 AS x);
FROM (DESCRIBE tbl);

Protobuf-Fehler für JupySQL in IPython

Das Laden der JupySQL-Erweiterung in IPython schlägt fehl:

In [1]: %load_ext sql
Terminal window
ImportError: cannot import name 'builder' from 'google.protobuf.internal' (unknown location)

Die Lösung besteht darin, das Paket protobuf zu reparieren. Dazu müssen möglicherweise konfliktierende Pakete deinstalliert werden, z. B.:

%pip uninstall tensorflow
%pip install protobuf