最終更新:

DuckDBの始め方 — CSVの集計とPython連携を小さな例で試す


CSVを読み、SQLで合計するsales.csv商品  金額apple  5000orange 3200apple  4100DuckDBPythonで実行SQLで集計SUM(amount)集計結果合計 12,300
本文と同じ3行のCSVを集計した例。Pythonのプロセス内で、別のDBサーバーを立てずに試せます。
🎚 難易度 ★★☆ 中級者向け
⏱ 学習時間の目安 読むだけ10分、インストール〜最初のクエリまで15分
📚 前提知識 sql-getting-started の基礎知識
✅ このガイドで学べること
  • DuckDBのインストールとCLI起動
  • CSVやParquetファイルへの直接クエリ
  • SQLiteとの違いと使い分け
  • Python連携の基本

Pythonで小さなCSVを集計する

Pythonを用意し、作業フォルダーに仮想環境を作ります。環境づくりに迷ったらPython入門へ進めます。

python -m venv .venv
# Windows(PowerShell)
.venv\Scripts\Activate.ps1
# macOS / Linuxなら:source .venv/bin/activate
python -m pip install duckdb

次の内容を sales.csv としてUTF-8で保存してください。

product,amount
apple,5000
orange,3200
apple,4100

同じフォルダーに analyze.py を保存します。

import duckdb

con = duckdb.connect()  # 保存ファイルを指定しないインメモリDB
total = con.execute(
    "SELECT SUM(amount) FROM 'sales.csv'"
).fetchone()[0]
print(total)  # 12300
con.close()

python analyze.py で 12300 と出れば成功です。CSVが見つからない場合は、実行時の作業フォルダーとファイル名を確認しましょう。PythonクライアントのインストールはCLIのインストールとは別です。CLIを使いたい場合は公式のインストール案内でOSに合った方法を選んでください。

次の一歩:商品別の集計と保存

import duckdb

con = duckdb.connect()
rows = con.execute("""
    SELECT product, SUM(amount) AS total
    FROM 'sales.csv'
    GROUP BY product
    ORDER BY product
""").fetchall()
print(rows)  # [('apple', 9100), ('orange', 3200)]
con.execute("""
    COPY (SELECT * FROM 'sales.csv')
    TO 'sales.parquet' (FORMAT PARQUET)
""")
con.close()

GROUP BY は商品ごとに集計する指定です。SQL入門で条件抽出や集計を復習できます。Parquetは列ごとにデータを扱うファイル形式で、保存した sales.parquet もSQLから読めます。

pandasと組み合わせる

python -m pip install pandas を追加で実行してから使います。

import duckdb
import pandas as pd

df = pd.read_csv('sales.csv')
result = duckdb.sql("""
    SELECT product, SUM(amount) AS total
    FROM df GROUP BY product ORDER BY product
""").df()
print(result)

SQLはPython変数の df を参照します。pandasを使うほうが書きやすい処理はそのまま残せます。処理速度はクエリやデータで変わるので、置き換えるだけで一定倍率速くなるとは限りません。

よくある詰まりポイント

Q. 同時に使うときの制限は?

通常のネイティブDBファイルを複数プロセスで開く場合、全プロセスを読み取り専用にするか、読み書きするプロセスを1つにします。1プロセス内の複数スレッドの書き込みと区別しましょう。複数ユーザーのWebアプリ向けDBとの比較はSQLiteとDuckDBの比較へ。

Q. S3から読み込むには?

httpfs 拡張に加え、非公開データにはAWSのアクセス権と認証が必要です。公式資料はSecretの credential_chain で既存の認証設定を使う方法などを案内しています。s3_region だけでは認証できません。まずローカルの例を動かしてから公式のS3手順を確認してください。

次に読む記事を、目的で選ぶ

  • 保存用DBと分析用DBを選びたいなら:SQLiteとDuckDBの比較 — 行の追加・更新と集計の使い分けを確認する。
  • GROUP BYなどのSQLを復習したいなら:SQL入門 — 条件抽出と集計の基本を学ぶ。
  • Pythonの環境づくりに迷ったら:uvとpipの比較 — パッケージ導入と環境管理の違いを確認する。

参考資料

確認日:2026年10月5日。

ひよこ ひよこ
DuckDBって、どんなデータベースなの?
ペンギン先生 ペンギン先生
CSVやParquetなどのデータを、SQLで集計・分析できるデータベースだよ。アプリやPythonプロセスの中で動かせるので、別のDBサーバーを用意せずに試せる。SQLiteの追加機能ではなく、別の製品なんだ。
ひよこ ひよこ
まずどうやって入れるの?
ペンギン先生 ペンギン先生
Pythonで使うなら `python -m pip install duckdb` でクライアントを入れよう。コマンドライン版とは別なので、これだけで `duckdb` コマンドが使えると思わないでね。下の例はPythonだけで試せるよ。
ひよこ ひよこ
CSVをそのまま集計できるの?
ペンギン先生 ペンギン先生
できるよ。例えば商品と金額を書いた `sales.csv` に対し、`SELECT SUM(amount) FROM 'sales.csv'` と実行すると合計を求められる。この記事では3行のサンプルを自分で作り、結果が12300になるところまで試そう。
ひよこ ひよこ
なぜ分析に向いているの?
ペンギン先生 ペンギン先生
列指向の保存やベクトル化した処理を使い、必要な列をまとめて処理する集計に向いているんだ。ただし他のDBより必ず速いわけではなく、データ量やクエリ、PCのメモリなどで変わるよ。
ひよこ ひよこ
pandasと一緒に使える?
ペンギン先生 ペンギン先生
pandasのDataFrameをSQLで集計できるし、結果を `.df()` でDataFrameに戻せるよ。pandasも別途インストールしよう。まずPythonだけの例を動かしてから、必要に応じて組み合わせればいいんだ。
ひよこ ひよこ
SQLiteとは、どちらを選べばいいの?
ペンギン先生 ペンギン先生
少数の行の追加・更新を中心に使うならSQLite、大きなファイルを横断して集計するならDuckDBを候補にできるよ。用途が違うので、具体例と同時アクセスの条件は次の[SQLiteとDuckDBの比較](/blog/sqlite-vs-duckdb/)で確認しよう。
ひよこ ひよこ
S3にあるファイルも読めるの?
ペンギン先生 ペンギン先生
httpfs拡張を使って読めるよ。非公開バケットにはアクセス権と認証が必要で、認証情報はSecretやcredential_chainで設定する。URLを書くだけで誰でも読めるわけではないんだ。
ひよこ ひよこ
複数の人から同時に書き込んでもいい?
ペンギン先生 ペンギン先生
通常のネイティブDBファイルでは、読み書きするプロセスは1つにする。別々の行などへの並行書き込みはそのプロセス内で可能だけれど、複数プロセスからの書き込みとは別だよ。まずこの記事では、自分のPythonプロセスだけで分析する形を試そう。

次に学ぶなら