DuckDBは、Windowsならwinget install DuckDB.cli、macOSならbrew install duckdb、Pythonならpip install duckdbの1行で入る分析用のSQLデータベースです。サーバーを立てずに、CSV・Parquet・JSONのファイルをそのままSQLで集計できます。
この記事では、2026年9月28日公開の最新版1.5.6で、OS別のインストール手順、CLIの基本操作、ファイルの読み込みと書き出し、Pythonからの使い方を、実行した出力つきで説明します。Shift_JISのCSVやファイルロックなど、つまずきやすいエラーの対処もまとめました。DuckDBそのものの仕組みやSQLiteとの性能比較はDuckDBとは?特徴・用途とSQLite・PostgreSQLとの違いを実測で解説【1.5.6対応】で扱っています。
まとめ:DuckDBのインストールと使い方の要点
- 最新版は1.5.6(2026年9月28日)です。長期サポート(LTS)版は1.4.5で、2.0.0は2026年10月21日に公開予定です。
- CLIはWindowsが
winget install DuckDB.cli、macOSがbrew install duckdb、Linuxとmacがcurl https://install.duckdb.org | bashで入ります。Windowsでは別途Microsoft Visual C++ 再頒布可能パッケージが必要です。 - Pythonは
pip install duckdbです。1.5系はPython 3.10以上が条件で、Python 3.9では1.4.5が警告なしに入ります。 - CLIは
duckdbだけで起動するとメモリ上で動き、duckdb analytics.duckdbのようにファイル名を渡すとデータが残ります。 - ファイルは
SELECT * FROM 'sales.csv'のように、ファイル名をテーブル名の位置に書くだけで読めます。Shift_JISのCSVはread_csv('…', encoding = 'shift_jis')で読みます。 - 1つのデータベースファイルを書き込みモードで開けるのは1プロセスだけです。CLIで開いたままPythonから接続すると、読み取り専用でもロックエラーになります。
| 環境 | インストールコマンド | 入る場所・確認 |
|---|---|---|
| Windows | winget install DuckDB.cli | duckdb –version |
| macOS | brew install duckdb | duckdb –version |
| Linux・macOS | curl https://install.duckdb.org | bash | ~/.duckdb/cli/latest/duckdb |
| Python 3.10以上 | pip install duckdb | duckdb.__version__ |
| conda | conda install -c conda-forge python-duckdb | duckdb.__version__ |
インストール前に選ぶこと:版とCLI・Pythonの使い分け
最新版1.5.6とLTS版1.4.5の選び分け
DuckDBは2026年10月時点で、最新の1.5系と、長期サポートの1.4系が並行して配布されています。公式のリリースカレンダーでは、1.5系のサポート終了は2026年11月1日、LTSの1.4系は2026年11月17日です。同じページに、2.0.0が2026年10月21日、2.0.1が11月18日の予定として載っています。
新しく始めるなら1.5.6を入れます。1.4系はLTSですが、コミュニティサポートは2026年11月17日に終わる予定なので、2026年10月時点で新しく入れて長く固定する選択には向きません。既に1.4系で動いている本番バッチは1.4.5へ上げたうえで、2.0の公開後に移行を検証します。2.0で変わるストレージ形式とQuackサーバーモードはDuckDB 2.0とは:Quackサーバーモード・新ストレージ形式と1.x系からの移行手順にまとめています。
CLIとPythonライブラリは別の配布物
DuckDBの入り口は、ターミナルで使うCLIと、Pythonなどから呼ぶライブラリの2つです。SQLでデータを探るならCLI、pandasの処理や定期バッチに組み込むならライブラリを選びます。両方入れても干渉しません。
注意したいのは、CLIとPythonライブラリの版が別々に決まることです。brew upgradeでCLIだけ上がり、Pythonは古いまま、ということが普通に起きます。版をそろえる手間を減らすなら、requirements.txtにduckdb==1.5.6のように書いて固定し、CLIも同じ版を入れます。なお、1.5.6のCLIで作ったファイルは、1.4.5のPythonからも開けました(既定のストレージ形式がv1.0.0+で作られるため)。
DuckDBのインストール手順:Windows・macOS・Linux・Python
Windows:wingetによるインストールとVC++再頒布パッケージ
Windowsでは、PowerShellかコマンドプロンプトでwingetを使います。公式のインストールページには「DuckDB on Windows requires the Microsoft Visual C++ Redistributable」と書かれており、起動時にvcruntime140.dllなどが見つからないと言われたら、Microsoftの配布ページからVisual C++ 再頒布可能パッケージを入れます。
winget install DuckDB.cli
duckdb --version
# LTS版を指定する場合
winget install DuckDB.cli --version 1.4.5
# 更新
winget upgrade DuckDB.cli
wingetが使えない端末では、同じページのduckdb_cli-windows-amd64.zip(ARM機はarm64)を展開し、そのフォルダにPATHを通します。PowerShell用のスクリプト(install.ps1)は公式が「beta」と明記しているため、業務端末ではwingetかZIPを選びます。
macOS:Homebrewによるインストールと更新
macOSはHomebrewの1行です。2026年10月13日時点のformulaはstable 1.5.6でした。
brew install duckdb
duckdb --version
# v1.5.6 (Variegata) 069cc9f9b5
# 更新
brew upgrade duckdb
Homebrewを入れていないMacは、次のLinuxと同じインストールスクリプトでも入ります。
Linux・macOS:インストールスクリプトの設置先とPATH
Linuxは、OSのパッケージではなく公式のインストールスクリプトを使います。実際にmacOSで実行すると、本体は~/.duckdb/cli/1.5.6/duckdbに置かれ、~/.duckdb/cli/latestがそこを指すシンボリックリンクとして作られました。
curl https://install.duckdb.org | bash
# 実行結果(抜粋)
Successfully installed DuckDB 1.5.6 to /Users/you/.duckdb/cli/1.5.6/duckdb
Updated symlink from /Users/you/.duckdb/cli/latest/duckdb to
/Users/you/.duckdb/cli/1.5.6/duckdb
Hint: Append the following line to your shell profile:
export PATH="/Users/you/.duckdb/cli/latest":$PATH
Also created a symlink from /Users/you/.local/bin/duckdb
最後の行のとおり、~/.local/binが既にあって書き込めるときは、そこにもduckdbへのリンクが作られます。このフォルダにPATHが通っていればすぐduckdbで起動でき、通っていなければ表示されたexport PATH=…の行を~/.zshrcや~/.bashrcに追記します。開いているターミナルにもすぐ反映するには、同じ行をその場で実行します。版を固定したいときはcurl https://install.duckdb.org | DUCKDB_VERSION=1.4.5 bashのように変数で指定します。インストールスクリプトの説明によると、Windowsではこのスクリプトは使えません。
Python:pip install duckdb とPython 3.10以上の条件
Pythonライブラリはpip install duckdbで入ります。PyPIの登録情報では、1.5.6の動作条件はRequires-Python >=3.10.0です。この条件のせいで、Python 3.9の環境では最新版が入らず、エラーも出さずに1.4.5が入ります。macOS標準の/usr/bin/python3(3.9.6)で確かめた結果が次です。
$ python3.13 -m venv venv313 && venv313/bin/pip install duckdb
$ venv313/bin/python -c "import duckdb; print(duckdb.__version__)"
1.5.6
$ /usr/bin/python3 -m venv venv39 && venv39/bin/pip install duckdb
$ venv39/bin/python -c "import duckdb; print(duckdb.__version__)"
1.4.5
$ venv39/bin/pip install "duckdb==1.5.6"
ERROR: Could not find a version that satisfies the requirement duckdb==1.5.6
(from versions: ... 1.4.3, 1.4.4, 1.4.5)
版を==1.5.6と指定すれば、上のようにエラーで止まるので気づけます。condaを使う場合はconda-forgeのpython-duckdb(2026年10月時点で1.5.6)を入れます。
DuckDB CLIの使い方:起動・永続化・出力形式
検証用サンプルデータの作成
この記事の出力は、次のスクリプトで作った3つのファイル(10万行の売上CSV、Shift_JISのCSV、入れ子を含むNDJSON)を使っています。作業用のフォルダで実行すると、以降の例と同じデータができます。標準ライブラリだけで動きます。掲載した容量と実行時間はmacOSでの値で、Windowsでは改行コードの違いでCSVの容量が変わります。
# mk.py(python3 mk.py で実行)
import random, json, datetime
random.seed(1)
regions = ['東京', '大阪', '名古屋', '福岡']
with open('sales.csv', 'w', encoding='utf-8') as f:
f.write('order_id,order_date,region,amount\n')
for i in range(1, 100001):
d = datetime.date(2026, 1, 1) + datetime.timedelta(days=i % 180)
f.write(f'{i},{d},{random.choice(regions)},{random.randint(500, 50000)}\n')
with open('sales_sjis.csv', 'w', encoding='shift_jis') as f:
f.write('受注ID,受注日,地域,金額\n')
for i in range(1, 6):
f.write(f'{i},2026-04-0{i},{regions[i % 4]},{i * 1000}\n')
with open('events.ndjson', 'w') as f:
for i in range(3):
f.write(json.dumps({"id": i, "user": {"name": f"u{i}", "plan": "pro" if i else "free"},
"tags": ["a", "b"][:i + 1]}) + '\n')
後で.readに渡すq.sqlは、SELECT count(*) AS n FROM sales;の1行だけのファイルです。
メモリ上で起動する方法とファイルに保存する方法
引数なしのduckdbはメモリ上のデータベースで起動し、終了すると作ったテーブルは消えます。ファイルの変換や一度きりの集計はこれで足ります。結果を残すときは、ファイル名を渡して起動します。拡張子は自由ですが、.duckdbが分かりやすいです。
$ duckdb analytics.duckdb
D CREATE TABLE sales AS FROM 'sales.csv';
D .tables
──── analytics ─────
─────── main ───────
┌────────────────────┐
│ sales │
│ │
│ order_id bigint │
│ order_date date │
│ region varchar │
│ amount bigint │
│ │
│ 100000 rows │
└────────────────────┘
10万行・3,043,068バイトのCSVを取り込んだanalytics.duckdbは798,720バイトでした。1.5.6の.tablesは、テーブル名だけでなく列の型と行数まで表示します。ブラウザで操作したいときはduckdb -uiで起動すると、公式のDuckDB UIが開きます(初回はui拡張が自動で入ります)。
-cによるSQL実行と.readによるSQLファイルの実行
前の例で起動したCLIは、.quitで終了してから次へ進みます(開いたままだと後述のロックエラーになります)。対話画面に入らずにSQLを流すときは-cを使います。SQLファイルは.readか標準入力で渡せます。シェルスクリプトやcronから呼ぶ定型処理はこの形にしておくと再現できます。
$ duckdb -c "SELECT region, count(*) AS n, sum(amount) AS total
FROM 'sales.csv' GROUP BY region ORDER BY total DESC;"
┌─────────┬───────┬───────────┐
│ region │ n │ total │
│ varchar │ int64 │ int128 │
├─────────┼───────┼───────────┤
│ 福岡 │ 25173 │ 636658222 │
│ 東京 │ 25092 │ 631479903 │
│ 大阪 │ 24947 │ 629531907 │
│ 名古屋 │ 24788 │ 624906686 │
└─────────┴───────┴───────────┘
$ duckdb analytics.duckdb -c ".read q.sql"
$ duckdb analytics.duckdb < q.sql
.modeによる出力形式の切り替え:markdown・csv・json
既定の表示は罫線つきのduckbox形式で、出力形式の一覧にはmarkdown・csv・json・jsonlines・htmlなど18種類があります。起動時に-markdownや-jsonのように指定するか、対話中に.mode markdownと打ちます。markdown形式は、そのままプルリクエストや社内Wikiに貼れます。
$ duckdb analytics.duckdb -markdown -c "SELECT region, sum(amount) AS total
FROM sales GROUP BY ALL ORDER BY total DESC LIMIT 2;"
| region | total |
|--------|----------:|
| 福岡 | 636658222 |
| 東京 | 631479903 |
$ duckdb -json -c "SELECT 1 AS a, 'x' AS b;"
[{"a":1,"b":"x"}]
CSVファイルへの書き出しには、出力先や形式をSQLの中で指定できる後述のCOPY文も使えます。1.5.6で試すと、-csvでは"名古屋",24788のように日本語の値が引用符で囲まれ、COPY文では名古屋,24788のまま書き出されました。どちらもCSVとして読み込めます。
.timer・.maxrows・-readonly:実行時間・表示行数・読み取り専用
.timer onにすると各クエリの実行時間が出ます。duckbox形式での表示行数の上限は.maxrowsで変えられ、ドットコマンドの一覧によると既定は40行です。本番のファイルを覗くだけなら-readonlyで開くと、誤って書き込む操作が拒否されます。
D .timer on
D SELECT count(*) FROM sales WHERE amount > 40000;
┌──────────────┐
│ count_star() │
│ int64 │
├──────────────┤
│ 20093 │
└──────────────┘
Run Time (s): real 0.021 user 0.002757 sys 0.001592
$ duckdb -readonly analytics.duckdb -c "INSERT INTO sales VALUES (0, DATE '2026-01-01', 'x', 1);"
Invalid Input Error: Cannot execute statement of type "INSERT" on database "analytics"
which is attached in read-only mode!
CSV・Parquet・JSONの読み込み:ファイルを直接SQLで集計
CSV:DESCRIBEによる推定型の確認
CSVはファイル名をFROMに書くだけで読めます。内部ではread_csvが呼ばれ、区切り文字・ヘッダーの有無・列の型をファイルの中身から推定します。推定結果はDESCRIBEで確かめられ、今回のCSVではorder_dateが日付型、amountが整数型と正しく判定されました。推定が外れたときだけread_csv('sales.csv', delim = ';', header = true)のように明示します。
D DESCRIBE SELECT * FROM 'sales.csv';
┌────────────────────┐
│ sales.csv │
│ │
│ order_id bigint │
│ order_date date │
│ region varchar │
│ amount bigint │
└────────────────────┘
D SUMMARIZE SELECT * FROM 'sales.csv'; -- 列ごとの最小・最大・概算ユニーク数・行数・平均を一度に見る
Shift_JISのCSV:encoding指定による読み込み
日本の業務データで多いShift_JISのCSVは、そのまま読むとエラーになります。CSVの説明によると、拡張なしで指定できる文字コードはutf-8・utf-16・latin-1の3つで、それ以外はencodings拡張が1,000種類以上を受け持ちます。1.5.6で試すと、encoding = 'shift_jis'を書いた時点でencodings拡張が自動で入り、INSTALLを書かなくても読めました(初回はネットワーク接続が必要です)。
D SELECT * FROM 'sales_sjis.csv' LIMIT 2;
Invalid Input Error: CSV Error on Line: 1
Invalid unicode (byte sequence mismatch) detected. This file is not utf-8 encoded.
D SELECT * FROM read_csv('sales_sjis.csv', encoding = 'shift_jis') LIMIT 2;
┌────────┬────────────┬─────────┬───────┐
│ 受注ID │ 受注日 │ 地域 │ 金額 │
│ int64 │ date │ varchar │ int64 │
├────────┼────────────┼─────────┼───────┤
│ 1 │ 2026-04-01 │ 大阪 │ 1000 │
│ 2 │ 2026-04-02 │ 名古屋 │ 2000 │
└────────┴────────────┴─────────┴───────┘
Pythonからは書き方によって結果が変わります(後述)。
Parquet:globとhive_partitioningによる複数ファイルの一括読み込み
ParquetもSELECT * FROM 'sales.parquet'で読めます。日付や月ごとに分かれたファイルは、*を使ったglobで1つのテーブルとして扱えます。m=1/のようなフォルダ名で分割されていれば、hive_partitioning = trueでフォルダ名を列として取り出せます。filename = trueを付けると、どの行がどのファイルから来たかも分かります。下のoutフォルダは、後のCOPYの例で作ります。
D SELECT count(*) AS n, count(DISTINCT filename) AS files
FROM read_parquet('out/*/*.parquet', filename = true);
┌────────┬───────┐
│ n │ files │
├────────┼───────┤
│ 100000 │ 6 │
└────────┴───────┘
D SELECT m, count(*) FROM read_parquet('out/*/*.parquet', hive_partitioning = true)
GROUP BY m ORDER BY m; -- m=1〜6 の月別件数が返る
Parquetの列指向の仕組みはParquetとは?読み方・仕組み・CSVとの違いをわかりやすく解説で説明しています。
JSON:入れ子の参照とunnestによる配列の展開
1行1レコードのJSON(NDJSON)もファイル名だけで読め、入れ子のオブジェクトは構造体型、配列はリスト型になります。入れ子の値はuser.nameかuser['plan']で取り出し、配列はunnestで行に展開します。事前に平らにしておく必要はありません。
D SELECT id, user.name AS name, user['plan'] AS plan, unnest(tags) AS tag
FROM 'events.ndjson';
┌───────┬─────────┬─────────┬─────────┐
│ id │ name │ plan │ tag │
├───────┼─────────┼─────────┼─────────┤
│ 0 │ u0 │ free │ a │
│ 1 │ u1 │ pro │ a │
│ 1 │ u1 │ pro │ b │
│ 2 │ u2 │ pro │ a │
│ 2 │ u2 │ pro │ b │
└───────┴─────────┴─────────┴─────────┘
COPYによる書き出し:CSVからParquetへの変換と月別の分割
書き出しはCOPY文です。PARTITION_BYを付けると、列の値ごとにフォルダを分けて書き出します。上のParquetの例は、次の1文でCSV(3,043,068バイト)から作ったもので、6つのファイルの合計は872,709バイトでした。
COPY (SELECT *, month(order_date) AS m FROM 'sales.csv')
TO 'out' (FORMAT parquet, PARTITION_BY (m), OVERWRITE_OR_IGNORE);
-- out/m=1/data_0.parquet 〜 out/m=6/data_0.parquet ができる
COPY (SELECT region, count(*) AS n FROM 'sales.csv' GROUP BY ALL ORDER BY 1)
TO 'r2.csv' (HEADER);
S3のファイル:httpfsの自動ロードとCREATE SECRET
S3やHTTPS上のファイルはs3://やhttps://で始まるパスをそのまま書けます。拡張機能の説明によると、必要なhttpfs拡張は初回の利用時に自動で入って読み込まれるため、INSTALL httpfsとLOAD httpfsは書かなくても動きます。認証情報はS3 APIの説明のとおりCREATE SECRETで登録します。
-- AWSのプロファイル・SSO・IAMロールをそのまま使う
CREATE SECRET (TYPE s3, PROVIDER credential_chain);
SELECT count(*) FROM 's3://my-bucket/sales/*.parquet';
キーを直接書く場合はPROVIDER configにKEY_ID・SECRET・REGIONを渡しますが、SQLファイルにキーが残るので、手元の検証以外ではcredential_chainを使います。ParquetをS3に置く構成の考え方はデータレイクとは?データウェアハウス・レイクハウスとの違いを実装視点で解説が前提知識になります。
PythonからのDuckDB操作:duckdb.sql・connect・pandas連携
duckdb.sqlとduckdb.connectの違い
duckdb.sql()は、duckdbモジュールの中にある共有のメモリ上データベースでSQLを実行します。duckdb.connect()は新しい接続を作り、引数なしならそれとは別のメモリ上データベース、ファイル名を渡せばそのファイルにつながります。次の実行結果のとおり、duckdb.sql()で作ったテーブルはduckdb.connect()からは見えません。
import duckdb
duckdb.sql("CREATE TABLE t AS SELECT 1 AS x")
duckdb.sql("SELECT * FROM t").fetchall() # [(1,)]
con = duckdb.connect() # 別のメモリ上DB
try:
con.sql("SELECT * FROM t")
except duckdb.CatalogException as e:
print(e) # Catalog Error: Table with name t does not exist!
finally:
con.close()
con = duckdb.connect("analytics.duckdb") # ファイルにつなぐ
con.execute("SELECT count(*) FROM sales WHERE region = ?", ["東京"])
con.fetchone() # (25092,)
con.close()
ノートブックでの探索はduckdb.sql()、定期実行のバッチやWebアプリはduckdb.connect()で接続を明示します。Python APIの説明には、共有の接続は「not thread-safe」とあり、複数スレッドから使うときはスレッドごとに接続を作る必要があります。値は文字列に埋め込まず、上の例のように?で渡します。
pandas・PolarsのDataFrameへの直接クエリ
この節のコードは、DuckDBを入れたPython環境で実行します。前述のvenv313ならsource venv313/bin/activateで有効にしてから、pip install pandas polars pyarrowでpandas・Polars・PyArrowを足します。Pythonの変数にあるpandasのDataFrameは、登録しなくても変数名でSQLから参照できます(置換スキャン)。結果は.df()でpandas、.pl()でPolars、.fetchall()でPythonのリストとして受け取ります。
import duckdb, pandas as pd
df = pd.read_csv("sales.csv")
duckdb.sql("SELECT count(*) FROM df WHERE amount > 40000").fetchone() # (20093,)
rel = duckdb.sql("SELECT region, sum(amount) AS total FROM 'sales.csv' GROUP BY ALL")
rel.df().dtypes # total は float64 になる
rel.pl() # Polars の DataFrame
1つ気をつけたいのは型の変換です。sum()の結果はDuckDB側ではint128(HUGEINT)で、.df()に渡すとpandasのfloat64になりました。金額をそのまま突き合わせる処理では、SQL側でsum(amount)::BIGINTのように型を決めてから受け取ります。pandasとPolarsの違いそのものはPolarsとは?pandasとの違い・高速化の仕組みと実務での採用判断【実装目線】で比べています。
PythonでShift_JISのCSVを読むときの書き方
1.5.6では、Python APIのduckdb.read_csv()にencodingを渡すとエラーになりました。shift_jisだけでなくutf-16でも同じでした。SQLのread_csvをduckdb.sql()経由で使うと読めます。
duckdb.read_csv("sales_sjis.csv", encoding="shift_jis")
# BinderException: Binder Error: Copy is only supported for UTF-8 encoded files, ENCODING 'UTF-8'
duckdb.sql("SELECT * FROM read_csv('sales_sjis.csv', encoding = 'shift_jis')").fetchone()
# (1, datetime.date(2026, 4, 1), '大阪', 1000)
使い始めでつまずくエラーと対処
Could not set lock:CLI・Python間のファイルロック競合
CLIでanalytics.duckdbを開いたまま、Pythonから同じファイルに接続すると、次のエラーになります。read_only=Trueを付けても結果は同じでした。DuckDBは1つのファイルを書き込みモードで開けるプロセスを1つに限るためで、書き込み側が開いている間は他のプロセスから読み取り専用でも開けません。
IOException: IO Error: Could not set lock on file ".../analytics.duckdb":
Conflicting lock is held in /Users/you/.duckdb/cli/1.5.6/duckdb (PID 48872) by user you.
See also https://duckdb.org/docs/stable/connect/concurrency
対処は、エラーに出ているPIDのプロセス(ここではCLI)を閉じることです。読み取りだけのプロセス同士なら、どちらも読み取り専用(CLIは-readonly、Pythonはread_only=True)で開けば同時に使えます。検証機でも、読み取り専用の接続を2つのプロセスから同時に開けました。逆に、読み取り専用の接続が開いている間に別のプロセスが書き込みモードで開こうとすると、こちらもロックエラーになりました。複数のプロセスやユーザーから書き込む必要がある場合の選択肢(DuckLakeなど)はDuckDBとはの制約の章で扱っています。
関数が見つからないエラー:CLIとPythonの版の確認
新しい関数や構文が使えないときは、まずCLIをduckdb --versionかPRAGMA version;、Pythonをduckdb.__version__で確かめます。検証機では、CLIがv1.5.6 (Variegata)、macOS標準のPython 3.9で入ったライブラリが1.4.5でした(前述のPython 3.10以上の条件のため)。版が合っているなら、関数名・構文の誤りや、必要な拡張機能が入っているかを確かめます。
DuckDBの使いどころ:1台で完結する分析と複数プロセス書き込みの制約
DuckDBは1台のマシンで、1人か少人数がファイルを集計・変換する作業に向いています。月次レポートの集計、受け取ったCSVの検品とParquetへの変換、データ分析の前処理は、クラウドのデータウェアハウスを契約する前にDuckDBで済ませて構いません。
使わない方がよいのは、複数の独立したプロセスが同じDuckDBファイルを直接開いて書き込む業務システムのバックエンドです。前の章のロックエラーのとおり、1ファイルに書けるのは1プロセスなので、この用途はPostgreSQLなどのサーバー型データベースを選びます。同じプロセスの中なら複数のスレッドから書き込めるので、利用者の人数だけで可否は決まりません。部署をまたいでデータを共有し、権限や監査ログを管理する全社の基盤も、DuckDB単体では作りません。基盤全体の層の分け方はデータ分析基盤の構築とは?5層アーキテクチャとBigQuery実装手順を技術視点で解説で整理しています。手元のDuckDBで検証した処理を本番の基盤へ載せ替える設計から相談したい場合は、当社のデータ分析基盤構築・MLOps構築支援で要件整理から実装までお手伝いします。
よくある質問
DuckDBは無料で商用利用できますか?
できます。DuckDBはMITライセンスで公開されており、社内利用でも製品への組み込みでも、ライセンス料や利用申請は要りません。再配布するときは、MITライセンスの著作権表示と許諾文を含めます。
DuckDBのダウンロード先はどこですか?
公式のインストールページです。OSと用途を選ぶとコマンドが表示され、CLIのZIP(Windows・macOS・Linux)を直接ダウンロードすることもできます。同じページでLTS版の1.4.5も選べます。
condaでDuckDBをインストールできますか?
できます。conda-forgeチャンネルのpython-duckdbがPythonライブラリで、2026年10月時点の版は1.5.6です。conda install -c conda-forge python-duckdbで入ります。
DockerでDuckDBを動かせますか?
動かせます。公式のインストールページにはduckdb/duckdbイメージを使うdocker runのコマンドが載っており、カレントフォルダを/workspaceにマウントして中のファイルをSQLで読めます。手元にインストールしたくない場合や、CIで使い捨ての環境を作る場合に向きます。
Python以外の言語からDuckDBを使えますか?
使えます。Rust・Go・Java(JDBC)・Node.js・Rなどにクライアントがあり、クライアントの一覧で言語ごとのサポート段階が示されています。C#(.NET)はコミュニティが保守するクライアントで、ブラウザで動かすWebAssembly版の仕組みはDuckDB WASMとは?ブラウザでSQL分析を実行する仕組みと実装・採用判断で扱っています。