Simon Willison's Weblog

Mapping SQLite result columns back to their source `table.column`

8.5内容质量

TL;DR · AI 摘要

SQLite 通过其 column-metadata API 可以映射查询结果列到原始表列,但 Python 的 sqlite3 模块未暴露此功能,需使用 apsw 或 ctypes 实现。

核心要点

  • SQLite 内部计算并暴露了列元数据,可通过 `SQLITE_ENABLE_COLUMN_METADATA` 编译选项启用。
  • Python 的 sqlite3 模块不支持直接获取列来源信息,但 apsw 库提供了 `cursor.description_full` 方法。
  • 使用 ctypes 可以调用 SQLite 的 `sqlite3_column_table_name()` 函数获取列来源信息。

结构提纲

按章节快速跳转。

  1. SQLite 内部计算并暴露了列元数据,但 Python 的 sqlite3 模块未提供此功能。

  2. SQLite 通过 `SQLITE_ENABLE_COLUMN_METADATA` 编译选项暴露列元数据,可用于映射查询结果列到原始表列。

  3. Python 的 sqlite3 模块未暴露 SQLite 的 column-metadata API,需使用第三方库或 ctypes 实现。

  4. 使用 apsw 库或 ctypes 调用 SQLite 的 C 函数可获取列来源信息。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • SQLite 列来源映射
    • SQLite 内部机制
      • column-metadata API
      • SQLITE_ENABLE_COLUMN_METADATA 编译选项
    • Python 实现方法
      • apsw 库
      • ctypes 调用 C 函数

金句 / Highlights

值得收藏与分享的关键句。

  • SQLite 内部计算并暴露了列元数据,可通过 `SQLITE_ENABLE_COLUMN_METADATA` 编译选项启用。

    第 2 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • Python 的 sqlite3 模块不支持直接获取列来源信息,但 apsw 库提供了 `cursor.description_full` 方法。

    第 3 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 使用 ctypes 可以调用 SQLite 的 `sqlite3_column_table_name()` 函数获取列来源信息。

    第 4 段

    ⬇︎ 下载 PNG𝕏 分享到 X
#SQLite#Python#apsw#ctypes
打开原文

研究:将 SQLite 查询结果列映射回其来源 `table.column`

Simon Willison 的博客

订阅

#smallhead

由以下公司赞助:

Teleport

— 防止访问瓶颈。统一身份。Teleport 用一个安全团队信任、工程师愿意使用的单一身份层,取代了碎片化的身份和访问工具。

2026 年 6 月 13 日

研究

将 SQLite 查询结果列映射回其来源 table.column

— 在任意 SQLite 查询中,确定每个结果列的来源 table.column 是可行的,因为 SQLite 在内部计算了这些信息,并在使用 SQLITE_ENABLE_COLUMN_METADATA 编译时,通过其列元数据 API 暴露了这些信息。虽然 Python 的标准 sqlite3 模块没有提供这些信息,但存在一些可靠的方法:使用第三方 apsw 库可以通过 cursor.description_full 直接访问,或者使用纯标准库的 ctypes 桥接(column_provenance.py)来获取这些信息……

如果 Datasette 中的任意 SQL 查询可以基于结果中包含的哪些表的哪些列,渲染出额外的信息,那将非常棒。

为了实现这一点,我们需要能够查看类似 select users.name, orders.total from users join orders on orders.user_id = users.id 的 SQL 查询,并能够编程地识别每个结果的 table.column —— 不仅要处理连接,还要处理更复杂的语法,如 CTE。

我决定将这个问题交给 Claude Code(Opus 4.8,因为 Fable 目前被美国政府禁止使用)来解决。它找到了几种有希望的解决方案:一种使用 apsw,另一种使用 ctypes 来访问 SQLite 的 sqlite3_column_table_name() C 函数(该函数通常不会暴露给 Python),还有一种通过巧妙地分析 EXPLAIN 的输出来实现。

发布于 2026 年 6 月 13 日晚上 11:05

最近的文章

  • 将 WASM 轮子发布到 PyPI 以与 Pyodide 一起使用 - 2026 年 6 月 13 日
  • Claude Fable 始终积极主动 - 2026 年 6 月 11 日
  • 对 Claude Fable 5 的初步印象 - 2026 年 6 月 9 日

#primary

这是 Simon Willison 于 2026 年 6 月 13 日发布的一篇文章。

python

1,261

sqlite

467

datasette

1,510

月度简报

以每月 10 美元赞助我,您将收到一份精选的电子邮件摘要,涵盖本月最重要的 LLM 发展。

让我少发点邮件给您!

赞助并订阅

.metabox

#secondary

#wrapper

  • 披露
  • 印刷说明
  • ©
  • 2002
  • 2003
  • 2004
  • 2005
  • 2006
  • 2007
  • 2008
  • 2009
  • 2010
  • 2011
  • 2012
  • 2013
  • 2014
  • 2015
  • 2016
  • 2017
  • 2018
  • 2019
  • 2020
  • 2021
  • 2022
  • 2023
  • 2024
  • 2025
  • 2026