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("...")ImportError: DLL load failed while importing duckdb: The specified module could not be found.Windows fatal exception: access violation
Current thread 0x0000311c (most recent call first): File "<stdin>", line 1 in <module>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:
python3 -m pip install duckdb --no-binary duckdbParametrisierte 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 querydf = conn.execute("SELECT * FROM my_table WHERE x = ?", [42]).df()
# Use a replacement scan to continue with the relational APIconn.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:
%sqlCREATE OR REPLACE TABLE tbl AS (SELECT 42 AS x);DESCRIBE tbl;Als Workaround können Sie sie in eine Unterabfrage einbetten:
%sqlCREATE 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 sqlImportError: 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