📊 DuckDB 文章质量审计报告
日期: 2026-08-30
扫描目录: /root/duckdb-blog/content/zh/post/
验证脚本: verify_duckdb_article_v3.py
DuckDB 版本: 运行时已验证(所有 EXPLAIN 执行成功)
总体统计
| 指标 | 数量 |
|---|
| 总文章数 | 269 篇 |
| ✅ 通过 | 117 篇 |
| ❌ 失败 | 152 篇 |
| 其中仅 temp 目录误报 | 36 篇 |
| 存在真实错误 | 116 篇 |
⚠️ 已知验证脚本误报
以下错误类别属于验证脚本的误报,不代表文章代码实际有问题:
1. “temp” 目录误报(36 篇文章受影响)
- 原因: 验证脚本执行
SET search_path TO temp; 后,DuckDB 将 temp.table_name 解释为目录限定名而非模式限定名 - 影响: 约 200+ 个代码块的 SQL 被错误标记
- 建议: 在验证脚本中跳过包含
temp. 前缀的查询,或改用 CREATE TEMP TABLE 方式测试
2. Jinja 模板语法(dbt 文章)
- 受影响文章: duckdb-dbt-data-modeling.md, duckdb-dbt-monetization-toolchain.md, duckdb-dbt-report-automation.md, duckdb-serverless-report-saas.md
- 原因:
{{ ref('...') }} 和 {{ config(...) }} 是 dbt Jinja 模板语法,非纯 SQL - 建议: 对 dbt 相关文章跳过 SQL 验证,或预处理模板变量
3. Shell/客户端命令被当作 SQL
- 受影响文章: duckdb-connect-uri-ephemeral-attach.md, duckdb-quack-core-extension-guide.md, duckdb-quack-protocol.md, duckdb-vs-sqlite-benchmark.md, duckdb-v154-variegata-key-features.md
- 原因:
CONNECT, !server, duckdb -c, .mode csv 等是 DuckDB CLI 命令,不是 SQL - 建议: 将这些代码块标记为
text 或 shell 而非 sql
4. 非 SQL 代码被当作 SQL 验证
- 受影响文章: duckdb-154-release.md, duckdb-ecommerce-profit-analyzer-saas.md, duckdb-financial-health-saas.md
- 原因: Python 代码块被错误分类为 SQL
- 建议: 检查 markdown 代码围栏语言标记
❌ 真实错误详情
🔴 严重错误(SQL 语法错误,无法运行)
1. duckdb-geojson-complete-guide.md(10 个错误)
- Line 41, 64, 91, 104, 182, 202, 216, 238, 245, 257 (SQL):
Binder Error: Invalid named parameter "geojson" for function read_json_auto - 原因:
read_json_auto 函数不支持 geojson 命名参数 - 修复建议: 使用
READ_JSON_AUTO('file.geojson', format='geojson') 或将格式作为位置参数传递
2. duckdb-read-duckdb-merge.md(9 个错误)
- Line 52 (SQL):
syntax error at or near "read_duckdb" — 文档说明被当作 SQL 执行 - Line 73, 83, 128, 158, 166, 198, 324, 425 (SQL):
read_duckdb(VARCHAR, VARCHAR) 参数不匹配 - 原因: 文章使用了两参数位置的
read_duckdb 调用,但当前版本需要关键字参数 table_name => '...' - 修复建议: 更新为
read_duckdb('pattern', table_name => 'orders') 或检查 DuckDB 版本兼容性
3. duckdb-python-udf.md(7 个错误)
- Line 55, 95, 147, 172, 197, 216, 352 (SQL):
syntax error at or near "RETURNS" - 原因: DuckDB 使用
CREATE FUNCTION ... AS 'expression' 语法,不支持标准 SQL 的 RETURNS 子句 - 修复建议: 将所有
CREATE FUNCTION ... RETURNS type AS 改为 CREATE FUNCTION ... AS 'expression' 或 LANGUAGE sql
4. duckdb-list-pivot-mastery.md(6 个错误)
- Line 129 (SQL):
syntax error at or near "cart" — PIVOT 语法错误 - Line 175, 220, 301, 392 (SQL):
TransactionContext Error: Current transaction is aborted - Line 238 (SQL):
syntax error at or near "INTO" - 原因: PIVOT 子句语法问题和事务累积错误
- 修复建议: 检查 PIVOT 语法,每个验证块使用独立连接
5. duckdb-pivot-long-to-wide.md(6 个错误)
- Line 56, 84, 102 (SQL):
syntax error at or near "sales_data" — PIVOT FROM 语法 - Line 117, 169 (SQL):
syntax error at or near "ON" — PIVOT ON 语法 - Line 132 (SQL):
syntax error at or near "monthly_sales" — CTE 别名问题 - 原因: PIVOT 语法示例不完整或有误
- 修复建议: 确保 PIVOT 语句包含完整的
FROM table_expression PIVOT (aggregate ON columns GROUP BY ...)
6. duckdb-pivot-unpivot-complete-guide.md(6 个错误)
- Line 28, 55, 114, 147 (SQL): TransactionContext 错误
- Line 135 (SQL):
syntax error at or near "WHERE" — UNPIVOT 后接 WHERE - Line 369 (Python):
invalid syntax. Perhaps you forgot a comma? - 原因: 事务累积 + UNPIVOT 语法问题 + Python 代码错误
- 修复建议: 分独立连接验证,修正 Python 代码逗号
7. duckdb-merge-into-production-guide.md(5 个错误)
- Line 36, 227, 284 (SQL):
syntax error at or near ".." — 省略号示例 - Line 128 (SQL):
Unconditional WHEN NOT MATCHED clause was already defined — MERGE INTO 重复子句 - Line 203 (SQL):
syntax error at or near "batch_size" — 参数化查询问题 - 原因: MERGE INTO 语句结构和省略号占位符
- 修复建议: 确保每个 MERGE INTO 只有一个 WHEN NOT MATCHED 子句,移除省略号或标记为伪代码
8. duckdb-pivot-unpivot-data-product.md(5 个错误)
- Line 68, 100, 129, 157 (SQL):
syntax error at or near "ON" — PIVOT/UNPIVOT ON 语法 - Line 227 (SQL):
syntax error at or near "SELECT" — UNPIVOT 后 SELECT - 原因: PIVOT/UNPIVOT 语法不正确
- 修复建议: 参考 DuckDB 官方 PIVOT 语法文档修正
9. read-duckdb-globbing.md(5 个错误)
- Line 36, 46, 57, 111, 123 (SQL):
Database "data/2024-01.duckdb" does not have any tables - 原因: read_duckdb 读取的空数据库文件,无表可用
- 修复建议: 创建测试数据库文件,或使用
table_name 参数指定存在的表
10. duckdb-copy-to-export-complete-guide.md(4 个错误)
- Line 66, 78, 216 (SQL):
Unrecognized option "ROWS_PER_GROUP" — 不支持的写入选项 - Line 131 (SQL):
syntax error at or near "||" — COPY TO 中使用字符串拼接 - 原因:
ROWS_PER_GROUP 在当前 DuckDB 版本中不存在,COPY TO 不支持表达式 - 修复建议: 移除
ROWS_PER_GROUP 选项,使用变量拼接文件路径
11. duckdb-data-encryption.md(4 个错误)
- Line 104 (SQL):
syntax error at or near "$" — shell 命令 $ hexdump... - Line 155 (SQL):
Unique file handle conflict — 重复附加同一数据库 - Line 182 (SQL):
syntax error at or near "RESULT" — RESULT 是保留字 - Line 212 (SQL):
Cannot create non-temporary entry "backup" in temporary catalog - 原因: shell 命令被当作 SQL,重复附加,保留字冲突
- 修复建议: 将 shell 命令移至 text 代码块,使用不同附加名,避免使用保留字
12. duckdb-iceberg-writes-catalog.md(4 个错误)
- Line 88, 238 (SQL):
syntax error at or near "PARTITION_BY" — 参数名错误 - Line 142 (SQL):
syntax error at or near "SYSTEM_VERSION" - Line 157 (SQL):
syntax error at or near "ROLLBACK" - 原因: Iceberg 写入参数名不正确
- 修复建议: 检查 DuckDB Iceberg 扩展的最新参数名
13. duckdb-lance-extension-guide.md(4 个错误)
- Line 109, 253, 275 (SQL):
syntax error at or near ".." — 省略号 - Line 131 (SQL):
syntax error at or near "=" — LanceDB 写入语法 - 原因: 省略号占位符和 LanceDB 写入语法
- 修复建议: 提供完整可执行的 LanceDB 代码示例
14. duckdb-partition-by-complete-guide.md(4 个错误)
- Line 110, 261 (SQL):
Unrecognized option "ROWS_PER_GROUP" — 不支持的 parquet 选项 - Line 169 (SQL):
Unrecognized option "OVERWRITE_MODE" — 不支持的 parquet 选项 - Line 286 (SQL):
syntax error at or near "WHERE" - 原因: 过时的 parquet 写入选项
- 修复建议: 移除
ROWS_PER_GROUP 和 OVERWRITE_MODE,使用当前支持的选项
15. duckdb-predicate-pushdown-filter-indexes.md(4 个错误)
- Line 101, 110, 119 (SQL):
syntax error at or near "WHERE" — 表达式过滤 - Line 242 (SQL):
syntax error at or near "." — range() 函数调用 - 原因: 复杂的 WHERE 条件和 range() 用法
- 修复建议: 简化过滤表达式,使用
SELECT * FROM range(10000000) 的正确语法
16. duckdb-154-release.md(3 个错误)
- Line 35 (SQL):
syntax error at or near "adbc_driver_manager" — Python import 被当 SQL - Line 103 (SQL):
syntax error at or near "FROM" — SHOW SCHEMAS FROM - Line 138 (SQL):
Qualified column names in UPDATE .. SET not supported - 原因: 代码块语言标记错误 + DuckDB 限制
- 修复建议: 修正 Python 代码块语言标记,避免在 UPDATE SET 中使用限定列名
17. duckdb-153-release.md(1 个错误)
- Line 142 (SQL):
syntax error at or near "BY" — INSERT OR REPLACE BY NAME - 原因:
INSERT OR REPLACE BY NAME 语法在当前版本可能不支持 - 修复建议: 确认 DuckDB v1.5 是否支持此语法,或改用
INSERT ... ON CONFLICT
18. duckdb-startup-analytics-dashboard.md(3 个错误)
- Line 32 (SQL):
syntax error at or near "DATABASE" — CREATE DATABASE IF NOT EXISTS - Line 325 (SQL):
syntax error at or near "PARTITION" — PARTITION BY RANGE - Line 353 (SQL):
syntax error at or near "GB" — PRAGMA max_memory = 8GB - 原因: DuckDB 不支持
CREATE DATABASE IF NOT EXISTS、PARTITION BY RANGE 和 8GB 语法 - 修复建议: 使用
CREATE DATABASE IF EXISTS,改用 DuckDB 支持的分区方式,使用 8 * 1024 * 1024 * 1024 数字
🟡 中等错误(Python 语法错误)
| 文章 | 行号 | 错误 |
|---|
| duckdb-ai-agent-brain.md | 130 | unterminated string literal (line 36) |
| duckdb-ai-data-qa-bot.md | 75 | unterminated string literal (line 53) |
| duckdb-data-acquisition.md | 22 | unexpected indent (line 2) |
| duckdb-financial-monitoring-system.md | 51 | invalid syntax (line 1) |
| duckdb-high-perf-aggregation-service.md | 134 | unindent does not match any outer indentation (line 33) |
| duckdb-industry-report-product.md | 86 | unindent does not match any outer indentation (line 85) |
| duckdb-json-irregular-data.md | 275, 296 | invalid syntax (line 5, 1) |
| duckdb-materialized-view-basics.md | 174 | unterminated string literal (line 22) |
| duckdb-pivot-by-expression.md | 105 | unterminated triple-quoted string literal (line 45) |
| duckdb-pivot-unpivot-complete-guide.md | 369 | invalid syntax, missing comma (line 2) |
| duckdb-python-cron-automated-income-report.md | 39 | f-string: unmatched ‘(’ (line 68) |
| duckdb-sql-rule-engine-anomaly-detection.md | 275 | invalid syntax (line 54) |
| duckdb-text-to-sql-bot.md | 87 | unterminated string literal (line 55) |
| duckdb-turbovec-vector-integration.md | 44 | invalid syntax (line 2) |
| duckdb-upcoming-v2-roadmap-preview.md | 216 | invalid syntax (line 2) |
| duckdb-zero-deploy-report-system.md | 152 | unindent does not match any outer indentation (line 16) |
🟠 功能限制类错误(DuckDB 不支持的功能)
| 错误类型 | 受影响文章数 | 示例 |
|---|
| CREATE EXTENSION(未加载扩展) | 3 | duckdb-ecommerce-competitor-monitoring-service.md, duckdb-production-deployment-guide.md, duckdb-online-shell.md |
| NOT IMPLEMENTED(功能未实现) | 5 | duckdb-async-io-parquet-benchmark.md (SHOW ALL), duckdb-copy-to-export-complete-guide.md (ROWS_PER_GROUP), duckdb-partition-by-complete-guide.md, duckdb-real-time-streaming-guide.md (partial indexes), duckdb-performance-tuning-ultimate-guide.md |
| read_duckdb 函数签名不匹配 | 2 | duckdb-read-duckdb-merge.md, read-duckdb-globbing.md |
| STRPOS 3 参数 | 1 | duckdb-string-functions-guide.md (DuckDB strpos 只支持 2 参数) |
| CREATE FUNCTION … RETURNS | 2 | duckdb-python-udf.md, duckdb-production-error-handling.md |
| partial indexes | 2 | duckdb-real-time-streaming-guide.md, duckdb-performance-tuning-ultimate-guide.md |
| CREATE CACHE TABLE | 1 | duckdb-production-enterprise-guide.md |
| ORDER BY | 1 | duckdb-explain-analyze.md, duckdb-production-deployment-guide.md |
| INSERT OR REPLACE BY NAME | 1 | duckdb-153-release.md |
| variant::VARCHAR .cast 语法 | 1 | duckdb-v154-variegata-key-features.md |
| -» 操作符 | 1 | duckdb-v15-variegata.md |
📋 按类别汇总
| 类别 | 文章数 | 严重度 |
|---|
| temp 目录误报(仅误报) | 36 | ⚪ 无影响 |
| Python 语法错误 | 16 | 🔴 严重 |
| Jinja 模板(dbt) | 4 | ⚪ 预期行为 |
| Shell 命令在 SQL 块中 | 5 | 🟡 中等 |
| SQL 语法错误(真实) | 35+ | 🔴 严重 |
| 功能未实现/不支持 | 15+ | 🟠 中等 |
| 外部文件/扩展依赖 | 10+ | 🟡 中等 |
| 事务累积错误 | 8+ | 🟡 中等 |
💡 建议
高优先级(修复真实代码错误)
- duckdb-geojson-complete-guide.md — 修正
read_json_auto 的 geojson 参数用法 - duckdb-read-duckdb-merge.md — 更新
read_duckdb 调用为关键字参数语法 - duckdb-python-udf.md — 将所有
RETURNS 语法改为 DuckDB 兼容的 AS 语法 - 所有 Python 语法错误文章(16 篇) — 修复字符串引号、缩进、f-string 问题
- PIVOT/UNPIVOT 相关文章(4 篇) — 修正 PIVOT 语法
- duckdb-copy-to-export-complete-guide.md — 移除不支持的
ROWS_PER_GROUP 选项 - duckdb-partition-by-complete-guide.md — 移除不支持的 parquet 选项
- duckdb-startup-analytics-dashboard.md — 修正
CREATE DATABASE IF NOT EXISTS、PARTITION BY RANGE、8GB 语法
中优先级(改进验证流程)
- 更新验证脚本 — 添加对
temp. 前缀的误报过滤 - 添加 Jinja 模板跳过 — 对 dbt 相关文章跳过 SQL 验证
- 添加 shell 命令识别 — 识别
CONNECT, !, .mode 等 CLI 命令并跳过 - 添加代码块语言检测 — 确保 Python 代码块不被当作 SQL 验证
低优先级(文档改进)
- 添加版本兼容性说明 — 对于使用特定 DuckDB 版本功能的文章,注明最低版本要求
- 外部依赖说明 — 对于需要扩展(fuzzy, postgres_fdw 等)的文章,添加安装说明
📈 质量评分
| 指标 | 数值 |
|---|
| 代码验证通过率 | 43.5% (117/269) |
| 真实错误率 | 43.1% (116/269) |
| 误报率 | 13.4% (36/269) |
| Python 代码错误 | 16 篇 |
| SQL 语法错误 | ~50 篇 |
| 功能不支持 | ~20 篇 |
报告由 Hermes Agent 自动生成 | 验证脚本 v3 | 扫描时间:2026-08-30