DuckDBの始め方 — CSVの集計とPython連携を小さな例で試す
- 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日。