PostgreSQLサンプルDBをDuckDB×ChatGPTで分析してみた(失敗編)
✅ 本記事の流れ
- はじめに
- 従来型とAI活用型の比較
- 前提(初心者向け補足)
- PostgreSQL
- Git & DuckDB(CLI)
- PostgreSQLにPagilaを投入
- DuckDB CLIを起動して拡張導入
- 正常な起動画面(DuckDB CLIの補足)
- エラーが出る場合と対策
- ChatGPTを使ったSQL生成(無償プラン)
- ChatGPTにDuckDB/Parquetファイルをアップロードして自然言語分析(有償プラン)
- よくあるエラーと対策
- まとめ
✅ 1. はじめに
従来は 本番DB → 分析DB → BI/Python が主流でした。
しかし DuckDB と GPT を組み合わせれば、
「意図を日本語で伝える → GPTがSQL生成 → DuckDBで即検証」 が可能です。
本記事では PostgreSQL のサンプルDB Pagila を使い、
DuckDBの postgres
拡張で取り込み、ChatGPTで自然言語分析する体験を紹介します。
⚠️ 本記事は「失敗編」です
ChatGPTにDuckDB/Parquetを直接アップロードして分析できると思って検証しましたが、
(ChatGPT Teamプラン)では未対応のため 失敗しました。
👉 ただし、DuckDBを使ったデータ抽出・変換手順自体は有効であり、
今後のAI分析やBIツール連携にもそのまま活用できます。
✅ 2. 従来型とAI活用型の比較
観点 | 従来型(分析DB/BI中心) | AI活用型(DuckDB × GPT) |
---|---|---|
初動 | ETL/モデル設計が必要 | DuckDBファイル+拡張で即開始 |
移送 |
ETLが前提 (分析用DBへデータを移す) |
2つの方法 ・ライブ参照:PostgreSQLを直接参照( postgres_scan )・CTAS: CREATE TABLE AS SELECT で必要なデータだけDuckDBファイルに保存 |
コスト | DWH/クラウド常時課金 | ローカル主体で低コスト |
再現性 | パイプライン管理 |
.duckdb と SQL/ノートを配布 |
学習体験 | ダッシュボード中心 | 意図→SQL→即結果 |
✅ 3. 前提(初心者向け補足)
環境構築が済んでいない方向けに、最低限の手順をまとめます。
詳しく知りたい方は公式サイトや参考リンクをご確認ください。
PostgreSQL
- PostgreSQL ダウンロード(日本語サイト) から最新Ver.17.xを入手
- インストーラは基本 デフォルトのまま進めてOK
- Select Components: すべてチェックのまま
- パスワード: 任意のもの(後で利用)
-
ポート番号: デフォルト
5432
- Locale: DEFAULT
- インストール後に
C:\Program Files\PostgreSQL\17\bin
を PATH に追加し、PCを再起動 -
psql --version
が動けば準備完了
参考情報
PostgreSQLのインストール手順については、以下の外部記事が画面キャプチャつきで詳しく解説されています。
必要に応じて参考にしてください。
👉 PostgreSQLをWindowsにインストールするには(Qiita)
Git
- Windowsなら以下でインストール可能:
winget install --id Git.Git -e
DuckDB
- DuckDB Installation から Windows (CLI) をダウンロード
-
duckdb.exe
を任意のフォルダに置き、次で確認:
duckdb --version
✅ 4. DuckDBでPostgreSQLを参照
まずは PostgreSQL のサンプルDB Pagila を投入して、DuckDBから参照できるようにします。
PostgreSQLにPagilaを投入
rem 途中経過でファイルをダウンロードするため、任意パスへ移動
cd 任意のパス
rem PostgreSQLのインストールとセットでインストールされたexeでDuckDB用データベース作成
createdb -U postgres pagila
rem インストール時に指定したユーザ:postgresのパスワードを入力
パスワード:
rem gitコマンドにてファイルをダウンロード
git clone https://github.com/devrimgunduz/pagila.git
Cloning into 'pagila'...
remote: Enumerating objects: 230, done.
remote: Counting objects: 100% (132/132), done.
remote: Compressing objects: 100% (50/50), done.
remote: Total 230 (delta 84), reused 82 (delta 82), pack-reused 98 (from 1)
Receiving objects: 100% (230/230), 55.44 MiB | 22.84 MiB/s, done.
Resolving deltas: 100% (120/120), done.
rem ダウンロードしたフォルダに移動
cd pagila
rem 最初に作成したデータベースにインストールする
psql -U postgres -d pagila -f pagila-schema.sql
ユーザー postgres のパスワード:
psql -U postgres -d pagila -f pagila-data.sql
ユーザー postgres のパスワード:
💡 補足(Windowsの場合)
上記のコマンドは コマンドプロンプトまたは PowerShell で実行してください。
✅ 5. DuckDB CLIを起動して拡張導入
duckdb pagila.duckdb
INSTALL postgres;
LOAD postgres;
✅ 正常な起動画面(DuckDB CLIの補足)
DuckDB CLIを起動すると、次のような画面になります:
C:\Users\xxxx> duckdb pagila.duckdb
DuckDB v1.3.2 (Ossivialis) 0b83e5d2f6
Enter ".help" for usage hints.
D
-
D
は DuckDBのプロンプト(カーソル) を表しています。- PostgreSQLの
psql
だとpostgres=#
、
WindowsコマンドプロンプトだとC:\>
のように、
ツールごとに「入力待ちの記号」が出ます。 - DuckDBではシンプルに
D
が表示されます。
- PostgreSQLの
✅ エラーが出る場合
もし拡張のインストールに失敗した場合、次のように表示されます:
D INSTALL postgres;
D LOAD postgres;
これは DuckDBが拡張モジュールをインターネットから取得できなかった ことを意味します。
対策
- ネットワーク接続を確認する
- プロキシやファイアウォールで制限されていないか確認する
- オフライン環境の場合は DuckDB公式サイト から手動で拡張モジュールを取得し、
LOAD
で読み込む
✅ 取り込み例(CTAS)
CREATE TABLE payment AS
SELECT * FROM postgres_scan('host=localhost port=5432 dbname=pagila user=postgres password=***',
'public','payment');
✅ 6. ChatGPTを使ったSQL生成(無償プランでも可)
無償プランでも ChatGPT に「テーブル名・カラム・やりたいこと」を伝えると SQL を生成してくれます。
そのSQLを DuckDB CLI に貼り付けて実行すればOKです。
👉 例:「payment
テーブルから月ごとの売上合計を出すSQLを書いてください」
sql SELECT DATE_TRUNC('month', payment_date) AS month, SUM(amount) AS revenue FROM payment GROUP BY 1 ORDER BY 1;
💡 補足
-
postgres_scan
の接続文字列で指定するpassword=***
は、PostgreSQLインストール時に設定したパスワード を使ってください。
実行結果の例
以下のように、月ごとの売上合計が出力されます(抜粋):
ChatGPTでのSQL生成例
ChatGPTに依頼した場合の生成例と解説:
💡 生成AIを利用する際の注意点
本記事では実際に実行したSQLと、ChatGPTが生成したSQLを並べて紹介しましたが、
両者は必ずしも同じクエリになるとは限りません。
- ChatGPTは文脈やバージョンによって、関数名やカラム名の扱いが異なる場合があります
- 戻ってきたSQLは必ず内容を確認し、必要に応じて修正してください
- 特に本番環境では、安全性やパフォーマンスの観点からも注意が必要です
👉 生成AIは「SQLを書くアシスタント」として利用し、
最終的な判断と責任は利用者自身にある と意識するのが大切です。
✅ 7. ChatGPTにDuckDBファイルをアップロードして自然言語分析(有償プラン)
ここからが本記事のメインです。
❌ (現状のTeamプランでは未対応のため失敗)
7-1. 一時ファイルを作成(事前準備)
PostgreSQLのデータを直接Parquetに出力することも可能ですが、
大規模データを扱う場合は メモリ不足で失敗するリスク があります。
そのため実務では、まず DuckDBの一時ファイル(.duckdb) に取り込み、
その後Parquetへ変換する流れを取るのが安全です。
💡 補足
DuckDBは内部的に、メモリに収まらないデータを自動的に
PRAGMA temp_directory
で指定した一時フォルダに退避(スピル)します。
一時ファイルを作成することで、低スペック環境でも安定して処理可能です。
DuckDB CLIを起動
duckdb C:/data/temp_pagila.duckdb
すると D プロンプトが表示されます(DuckDB CLIに入った状態)。
DuckDB CLI内で実行するSQL
INSTALL postgres;
LOAD postgres;
CREATE TABLE payment AS
SELECT * FROM postgres_scan('host=localhost port=5432 dbname=pagila user=postgres password=***',
'public','payment');
これで PostgreSQLの payment テーブルが
C:/data/temp_pagila.duckdb に保存されます。
👉 以降の処理(7-2以降)は、このDuckDBファイルを使ってParquetにエクスポートします。
DuckDB CLIの終了方法(補足)
DuckDB CLIを終了するには、以下を入力します:
.exit
または:
.quit
⚠️ PostgreSQL の \q は DuckDB では使えません。
SQLコマンドと混同しないよう、必ずドット (.) から始めてください。
7-2. DuckDB CLIでPostgreSQLを参照し、Parquetへエクスポート
一時ファイル(例:C:/data/temp_pagila.duckdb)を作成したら、SQLを .sql ファイルに保存して .read で実行するのが確実です(Windows向け推奨)。
全体の流れは以下の通りです:
- SQLをファイルに保存(.sql)
- DuckDB CLIで .read を実行
- Parquetファイルとして保存
- 必要に応じてタスクスケジューラに登録(自動化)
💡 注意
出力先ディレクトリ(例:C:/export/)は事前に作成してください。
mkdir C:\export
①データを抽出してParquetに保存
ケースA. 1か月分を抽出してParquetに保存(シンプル版)
例:payment
テーブルから 2024年1月分 だけ抽出して保存:
- SQL ファイル作成(例:C:/data/export_month.sql)
下記をテキスト形式で保存
👉 実行後、C:/export/payment_2024_01.parquet が生成されます
COPY (
SELECT payment_id, customer_id, amount, payment_date
FROM payment
WHERE payment_date >= DATE '2024-01-01'
AND payment_date < DATE '2024-02-01'
) TO 'C:/export/payment_2024_01.parquet' (FORMAT PARQUET);
- 実行コマンド(cmd.exe)
duckdb C:/data/temp_pagila.duckdb -c ".read C:/data/export_month.sql"
ケースB. 年/月ごとにパーティション分割して保存(実務向け)
- SQL ファイル作成(例:C:/data/export_partition.sql)
下記をテキスト形式で保存
👉 実行後、C:/export/payment_partitioned/ 以下に year=2022/month=01/ のようなフォルダ構造で保存されます
COPY (
SELECT *,
EXTRACT(YEAR FROM payment_date)::INT AS year,
EXTRACT(MONTH FROM payment_date)::INT AS month
FROM payment
) TO 'C:/export/payment_partitioned/' (FORMAT PARQUET, PARTITION_BY (year, month));
- 実行コマンド(cmd.exe)
duckdb C:/data/temp_pagila.duckdb -c ".read C:/data/export_partition.sql"
出力フォルダ構成の例:
year=2024/month=01/...
year=2024/month=02/...
👉 分析者は必要な月のParquetだけをアップロードして分析できます。
② コマンドプロンプトから1行で実行(自動化向け)
タスクスケジューラに登録して定期実行すれば、自動化が可能です。
例:毎日 1:00 に月次エクスポートSQLを実行するタスク
(必要に応じてログ出力を付与)
duckdb C:/data/temp_pagila.duckdb -c ".read C:/data/export_month.sql" > C:\logs\duckdb_export.log 2>&1
💡 バッチファイル化して運用する
上記コマンドをバッチファイル(例:export_parquet.bat)に保存すれば、
タスクスケジューラで「プログラム/スクリプト」にそのバッチを指定するだけで定期実行できます。
export_parquet.bat(文字コードはShift-JISを推奨)
UTF-8 BOM だと先頭に不可視文字が混入してコマンド解釈が崩れることあり
@echo off
@setlocal enabledelayedexpansion
@rem === 設定(必要に応じて書き換え) =========================
@set DUCKDB_EXE=duckdb.exe
@set DB=C:\data\temp_pagila.duckdb
@set SQL_MONTH=C:\data\export_month.sql
@set SQL_PART=C:\data\export_partition.sql
@set LOG=C:\data\logs\duckdb_export.log
@rem ============================================================
if not exist "C:\export" mkdir "C:\export"
if not exist "%DB%" (
echo [ERROR] DB not found: %DB%
exit /b 1
)
if not exist "%SQL_MONTH%" (
echo [ERROR] SQL not found: %SQL_MONTH%
exit /b 1
)
if not exist "%SQL_PART%" (
echo [ERROR] SQL not found: %SQL_PART%
exit /b 1
)
if not exist "%LOG%" (
for %%d in ("%LOG%") do if not exist "%%~dpd" mkdir "%%~dpd"
type nul > "%LOG%"
)
@set FAIL=0
@echo -------------------------------------------------->> "%LOG%"
@echo [!date! !time!] monthly start>> "%LOG%"
"%DUCKDB_EXE%" "%DB%" < "%SQL_MONTH%" >> "%LOG%" 2>&1
if errorlevel 1 (
echo [!date! !time!] monthly FAILED (errorlevel !errorlevel!)>> "%LOG%"
set FAIL=1
) else (
echo [!date! !time!] monthly OK>> "%LOG%"
)
@echo -------------------------------------------------->> "%LOG%"
@echo [!date! !time!] partition start>> "%LOG%"
"%DUCKDB_EXE%" "%DB%" < "%SQL_PART%" >> "%LOG%" 2>&1
if errorlevel 1 (
echo [!date! !time!] partition FAILED (errorlevel !errorlevel!)>> "%LOG%"
set FAIL=1
) else (
echo [!date! !time!] partition OK>> "%LOG%"
)
@echo [!date! !time!] DONE>> "%LOG%"
@endlocal
@exit /b %FAIL%
👉 この方法なら、運用担当者がタスクスケジューラのGUIから設定するだけで自動化可能になります。
ポイント
- .read はインタラクティブCLI専用のメタコマンドです。バッチ実行では duckdb DB < script.sql の形にすると安定します。
- パスは バックスラッシュでもOK ですが、SQL内の出力先は C:/export/...(スラッシュ) を推奨(エスケープ不要)。
- ログに monthly OK / partition OK と出れば成功です。FAILED のときは直前の出力に原因(パス誤り、権限、拡張未ロード等)が出ます。
⚠️ 注意
- *data\logs* フォルダは事前に作成してください(存在しないとエラーになります)。
- 必要に応じてログファイルの保存場所を変更してください。
💡 補足
- DuckDBの自動化スクリプトは以下のリポジトリで公開しています:
👉 サンプルリポジトリ: duckdb-export-scripts (GitHub)
7-3. ChatGPTの画面にファイルをアップロード
生成された .parquet ファイル(またはフォルダ配下の月別ファイル)を
ChatGPTの画面にドラッグ&ドロップします
💡 補足
ファイルをアップロードしただけでは処理は実行されません。
アップロード後に必ず自然言語で依頼を入力してください。
👉 例:
アップロードした payment_2024_01.parquet から月ごとの売上を集計してください。
⚠️ 実際の検証結果(失敗)
今回の検証環境(ChatGPT Teamプラン)では、
Parquetファイルをアップロードしても解析できず、SQL実行まで進めませんでした。
(下記キャプチャ参照)
👉 現状は Enterprise環境や一部の段階的リリースでのみ対応している可能性 があり、
Team環境では未対応です。今後、機能が有効化された場合に再検証予定です。
7-4. 自然言語で質問するだけ
※以下は将来の利用イメージです(検証環境では未実行)。
例1: 月別売上をグラフで表示
質問(自然言語):
2024年の月別売上を集計して棒グラフで表示してください。
ChatGPT が内部でSQLを生成・実行し、棒グラフを返してくれる想定です。
(ここにスクショを掲載:図1)
例2: 上位顧客ランキング
質問(自然言語):
直近3か月の支払額TOP10の顧客を表形式で教えてください。
ChatGPT がSQLを実行し、結果を表形式で返してくれる想定です。
(ここにスクショを掲載:図2)
✅ 8. よくあるエラーと対策
-
psql
が見つからない
→ PATH にC:\Program Files\PostgreSQL\17\bin
を追加して PC を再起動 -
DuckDBで
INSTALL postgres;
が失敗する
→ ネットワーク接続が必要。オフライン環境なら拡張を手動配置 -
postgres_scan
で認証エラー
→ インストール時のパスワードを確認。ユーザ名は通常postgres
-
ポートが5432以外の場合
→postgres_scan
の接続文字列にport=XXXX
を指定
✅ 9. まとめ
今回の検証では、以下のことが確認できました。
- ✅ PostgreSQL から DuckDB/Parquet 形式に変換できる
- ✅ Windows タスクスケジューラ+バッチで定期自動化できる
- ❌ ChatGPT(Teamプラン)に直接 Parquet をアップロードして分析することは現状できなかった
💡 勘違いしやすいポイント
- 「DuckDB/Parquet は AI にとって扱いやすい形式」というのは正しい
- 列指向で軽量・圧縮効率が高く、AIモデルやPython/Polarsなどの分析環境と相性が良い
- ただし「ChatGPT が今すぐ直接 DuckDB/Parquet を分析できる」とは限らない
- 現状は Enterprise 環境や一部の段階的リリースで対応中
- Team 環境では未対応のため、実際にはエラーになる
👉 よって 「現時点での実用的な提案」 は、DuckDB/Parquet を作成して BI ツールや Python で分析に活用すること。
将来的に ChatGPT が直接分析可能になれば、今回の仕組みがそのまま活きるため、準備としては無駄になりません。
📌 補足
本記事は「失敗編」としての記録です。
ChatGPTにParquet/DuckDBファイルを直接アップロードして分析する機能は、
現状のTeamプランでは未対応でした。
将来的に機能が有効化された場合には「成功編」として続編を公開予定です。
Discussion