⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
故障排除

故障排除

运行 EXPLAIN 时渲染换行符

在 Python 中,EXPLAIN 语句的输出包含硬换行符(\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   …  │
└───────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

要解决此问题,请 print 输出 explain() 函数的结果

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

另请查看 Jupyter 指南,了解有关将 Jupyter 与 JupySQL 结合使用的技巧。

Windows 上的崩溃和错误

在 Windows 上导入 DuckDB 时,Python 运行时可能会在导入或首次使用时崩溃或返回错误

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)

此问题很可能是由于使用了过时的 Microsoft Visual C++ (MSVC) 可再发行组件包导致的。解决方法是安装 最新的 MSVC 可再发行组件包。或者,您可以指示 pip 通过以下方式从源码编译该包

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

关系 API 中的参数化查询

sql()query()from_query() 方法传递查询参数具有显著的性能开销。目前核心中的关系类型尚不支持预处理语句,因此参数化查询会立即物化为中间表示。与非参数化路径相比,这至少会产生 5 倍的处理开销和近 2 倍的内存使用量。

建议改为对参数化查询使用 execute(),然后通过 替换扫描 (replacement scan) 将结果输入到关系 API 中

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()

已知问题

遗憾的是,有些问题要么超出了我们的控制范围,要么非常隐蔽/难以追踪。以下是您可能需要注意的问题列表,具体取决于您的工作流程。

Numpy 导入多线程问题

当使用多线程并直接以 Numpy 数组形式或通过 Pandas DataFrame 间接获取结果时,可能有必要确保导入了 numpy.core.multiarray。如果此模块未从主线程导入,而执行过程中的另一个线程尝试导入它,则会导致死锁或崩溃。

为避免这种情况,建议在启动线程之前 import numpy.core.multiarray

DESCRIBESUMMARIZE 在 Jupyter 中返回空表

DESCRIBESUMMARIZE 语句返回空表

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

要解决此问题,请将它们包装在子查询中

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

IPython 中 JupySQL 的 Protobuf 错误

在 IPython 中加载 JupySQL 扩展失败

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

解决方法是修复 protobuf 包。这可能需要卸载冲突的包,例如

%pip uninstall tensorflow
%pip install protobuf
© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南