将SQLite结果列映射回其源 `表.列`
摘要
本研究探索了在任意SQLite查询中,确定每个结果列的源表和源列的方法,通过使用SQLite内部列元数据API(通过Python的apsw库或ctypes桥接访问),并应用于Datasette等工具。
暂无内容
查看缓存全文
缓存时间: 2026/06/14 07:34
# 研究:将 SQLite 查询结果列映射回源 `table.column`
来源:https://simonwillison.net/2026/Jun/13/sqlite-column-provenance/
研究(https://simonwillison.net/elsewhere/research/)
映射 SQLite 查询结果列回源 `table.column`(https://github.com/simonw/research/tree/main/sqlite-column-provenance#readme)
—— 对于任意 SQLite 查询,确定每个结果列对应的源 `table.column` 是可行的,因为 SQLite 内部会计算该信息,并在编译时启用了 `SQLITE_ENABLE_COLUMN_METADATA` 的情况下,通过其列元数据 API 暴露出来。虽然 Python 标准库的 `sqlite3` 模块不直接提供此信息,但存在稳健的方法:使用第三方库 `apsw` 可通过 `cursor.description_full` 直接访问,或者通过纯标准库的 ctypes 桥接(`column_provenance.py`)来检索……
如果能让 Datasette(https://datasette.io/)中的任意 SQL 查询根据结果中包含了来自哪些表的哪些列来呈现额外信息,那将非常巧妙。
要实现这一点,我们需要能够分析类似 `select users.name, orders.total from users join orders on orders.user_id = users.id` 这样的 SQL 查询,并以编程方式识别每个结果列的 `table.column` —— 不仅处理 JOIN,还要处理更复杂的语法如 CTE。
我决定让 Claude Code(Opus 4.8,因为 Fable 目前被美国政府禁止 https://simonwillison.net/2026/Jun/13/us-government-directive-to-suspend-access/)来解决这个问题。它找到了几个可行的方案——一个使用 apsw(https://github.com/rogerbinns/apsw),另一个使用 `ctypes` 调用 SQLite 的 `sqlite3_column_table_name()` C 函数(https://sqlite.org/c3ref/column_database_name.html)(该函数在 Python 中没有其他暴露方式),还有一个是通过巧妙分析 `EXPLAIN` 的输出得到。
相似文章
SQLite查询结果格式化演示
基于WebAssembly的交互式演示,允许用户以20多种样式格式化SQL查询结果,包括表格、CSV、JSON、HTML和Markdown,并支持实时调整。
在Google表格中使用SQL函数从Datasette获取数据
Simon Willison分享了使用SQL函数从Datasette获取数据到Google表格的技巧,包括importdata()、命名函数以及支持API令牌的Google Apps Script方法。
SQLite 3.53.0
SQLite 3.53.0 发布,带来重要的累积改进,包括 ALTER TABLE 约束修改、新的 JSON 函数(json_array_insert),以及通过新的查询结果格式化库实现的重大 CLI 模式增强。
ProSPy:面向企业文本到SQL的剖析驱动的SQL-Python智能体框架
ProSPy 是一个面向企业文本到 SQL 的剖析驱动型 SQL-Python 智能体框架,将推理过程结构化分为四个阶段:自动剖析、模式剪枝、方言无关的 SQL 接口以及基于 Python 的分析。在使用 Claude-4.5-Opus 模型时,它在 Spider 2.0-Lite 和 Spider 2.0-Snow 数据集上分别达到了 60.15% 和 60.51% 的执行准确率,优于多个强基线模型。
用于分析的纯 Clojure 列式数据库
Flatiron 是一个纯 Clojure 的列式分析库,用于内存表,具有类似 SQL 的 DSL,专为使用原始数组和批处理的高性能而设计。