🦆

PostgreSQLサンプルDBをDuckDB×ChatGPTで分析してみた(失敗編)

に公開

✅ 本記事の流れ

  1. はじめに
  2. 従来型とAI活用型の比較
  3. 前提(初心者向け補足)
    • PostgreSQL
    • Git & DuckDB(CLI)
  4. PostgreSQLにPagilaを投入
  5. DuckDB CLIを起動して拡張導入
    • 正常な起動画面(DuckDB CLIの補足)
    • エラーが出る場合と対策
  6. ChatGPTを使ったSQL生成(無償プラン)
  7. ChatGPTにDuckDB/Parquetファイルをアップロードして自然言語分析(有償プラン)
  8. よくあるエラーと対策
  9. まとめ

✅ 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
  • DDuckDBのプロンプト(カーソル) を表しています。
    • PostgreSQLの psql だと postgres=#
      Windowsコマンドプロンプトだと C:\> のように、
      ツールごとに「入力待ちの記号」が出ます。
    • DuckDBではシンプルに D が表示されます。

✅ エラーが出る場合

もし拡張のインストールに失敗した場合、次のように表示されます:

D INSTALL postgres;
D LOAD postgres;

これは DuckDBが拡張モジュールをインターネットから取得できなかった ことを意味します。

対策

  1. ネットワーク接続を確認する
  2. プロキシやファイアウォールで制限されていないか確認する
  3. オフライン環境の場合は 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インストール時に設定したパスワード を使ってください。

実行結果の例

以下のように、月ごとの売上合計が出力されます(抜粋):

SQL実行結果の例


ChatGPTでのSQL生成例

ChatGPTに依頼した場合の生成例と解説:

ChatGPT生成SQLの例


💡 生成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向け推奨)。

全体の流れは以下の通りです:

  1. SQLをファイルに保存(.sql)
  2. DuckDB CLIで .read を実行
  3. Parquetファイルとして保存
  4. 必要に応じてタスクスケジューラに登録(自動化)

💡 注意

出力先ディレクトリ(例:C:/export/)は事前に作成してください。

mkdir C:\export

①データを抽出してParquetに保存
ケースA. 1か月分を抽出してParquetに保存(シンプル版)

例:payment テーブルから 2024年1月分 だけ抽出して保存:

  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);
  1. 実行コマンド(cmd.exe)
duckdb C:/data/temp_pagila.duckdb -c ".read C:/data/export_month.sql"

ケースB. 年/月ごとにパーティション分割して保存(実務向け)

  1. 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));
  1. 実行コマンド(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