SQLiteのクエリ結果カラムを元のテーブル.カラムにマッピングする
任意のSQLiteクエリ結果の各カラムがどのテーブルのどのカラムから来たかを特定することは、SQLiteが内部でこの情報を計算し、SQLITE_ENABLE_COLUMN_METADATAが有効な場合にカラムメタデータAPIを介して公開するため、実現可能です。Pythonの標準sqlite3モジュールはこの情報を提供しませんが、apswライブラリを使えばcursor.description_fullで直接アクセスでき、ctypesブリッジ(column_provenance.py)でC関数sqlite3_column_table_name()を呼び出す方法や、EXPLAIN出力を解析する方法もあります。
Datasetteのようなデータ探索ツールにおいて、任意のSQLクエリ結果の各カラムがどのテーブルのどのカラムから来たのかを自動的に特定できれば、ユーザー体験は大幅に向上します。例えば、select users.name, orders.total from users join orders on orders.user_id = users.idというクエリに対して、結果のnameカラムがusers.name、totalカラムがorders.totalから来ていることをプログラムが認識できるようになれば、列ごとのソース表示や権限制御が可能になります。
Simon Willison氏はこの問題に取り組み、Claude Code(Opus 4.8モデル、当時Fableは米国政府により使用禁止)を用いて複数の解決策を発見しました。
第一の方法は、サードパーティライブラリapswを使用するものです。apswはSQLiteのC APIを直接ラップしており、cursor.description_full属性を通じて各カラムのテーブル名と元のカラム名を取得できます。第二の方法は、Python標準ライブラリのみで実現可能で、ctypesモジュールを使ってSQLiteのC関数sqlite3_column_table_name()を呼び出します。この関数は標準のsqlite3モジュールでは公開されていませんが、ctypesを用いれば簡単にアクセスできます。第三の方法は、EXPLAIN文の出力を解析してカラムの由来を推測するもので、SQLiteのメタデータAPIに依存しません。
これらの方法が動作するためには、SQLiteがコンパイル時にSQLITE_ENABLE_COLUMN_METADATAオプションを有効にしてビルドされている必要があります。幸い、主要なPythonディストリビューション(python.orgからダウンロードしたものなど)に含まれるSQLiteはデフォルトでこのオプションが有効になっているため、特別な設定は通常不要です。
この技術が実装されれば、Datasetteのクエリ結果画面で各カラムの横にソーステーブル名を表示したり、クリックして詳細を確認したりできるようになります。また、カラムレベルのアクセス制御やデータリネージの自動生成にも応用可能です。現在は研究段階ですが、複数の実現可能な方法が示されたことで、今後の開発が期待されます。