---
title: "DuckDBの使い方：インストールからCLI・Python・ファイル読み込みまでの手順【1.5.6対応】"
url: "https://www.issoh.co.jp/tech/details/15377/"
published: 2026-07-19
updated: 2026-10-13
categories: ["データ分析・BI"]
publisher: "株式会社一創"
---

# DuckDBの使い方：インストールからCLI・Python・ファイル読み込みまでの手順【1.5.6対応】

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対応】](/tech/details/5741/)で扱っています。

## まとめ：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系が並行して配布されています。[公式のリリースカレンダー](https://duckdb.org/release%5Fcalendar)では、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系からの移行手順](/tech/details/18227/)にまとめています。

### 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を使います。[公式のインストールページ](https://duckdb.org/install/)には「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`のように変数で指定します。[インストールスクリプトの説明](https://duckdb.org/docs/stable/operations%5Fmanual/installing%5Fduckdb/install%5Fscript)によると、Windowsではこのスクリプトは使えません。

### Python：pip install duckdb とPython 3.10以上の条件

Pythonライブラリは`pip install duckdb`で入ります。[PyPIの登録情報](https://pypi.org/project/duckdb/)では、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`形式で、[出力形式の一覧](https://duckdb.org/docs/stable/clients/cli/output%5Fformats)には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`で変えられ、[ドットコマンドの一覧](https://duckdb.org/docs/stable/clients/cli/dot%5Fcommands)によると既定は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の説明](https://duckdb.org/docs/stable/data/csv/overview)によると、拡張なしで指定できる文字コードは`utf-8`・`utf-16`・`latin-1`の3つで、それ以外は[encodings拡張](https://duckdb.org/docs/stable/core%5Fextensions/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との違いをわかりやすく解説](/tech/details/5547/)で説明しています。

### 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://`で始まるパスをそのまま書けます。[拡張機能の説明](https://duckdb.org/docs/stable/extensions/overview)によると、必要なhttpfs拡張は初回の利用時に自動で入って読み込まれるため、`INSTALL httpfs`と`LOAD httpfs`は書かなくても動きます。認証情報は[S3 APIの説明](https://duckdb.org/docs/stable/core%5Fextensions/httpfs/s3api)のとおり`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に置く構成の考え方は[データレイクとは？データウェアハウス・レイクハウスとの違いを実装視点で解説](/tech/details/13388/)が前提知識になります。

## 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の説明](https://duckdb.org/docs/stable/clients/python/overview)には、共有の接続は「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との違い・高速化の仕組みと実務での採用判断【実装目線】](/tech/details/13618/)で比べています。

### 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とは](/tech/details/5741/)の制約の章で扱っています。

### 関数が見つからないエラー：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実装手順を技術視点で解説](/tech/details/15337/)で整理しています。手元のDuckDBで検証した処理を本番の基盤へ載せ替える設計から相談したい場合は、当社の[データ分析基盤構築・MLOps構築支援](/service/ai/data-platform/)で要件整理から実装までお手伝いします。

## よくある質問

### DuckDBは無料で商用利用できますか？

できます。DuckDBはMITライセンスで公開されており、社内利用でも製品への組み込みでも、ライセンス料や利用申請は要りません。再配布するときは、MITライセンスの著作権表示と許諾文を含めます。

### DuckDBのダウンロード先はどこですか？

[公式のインストールページ](https://duckdb.org/install/)です。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などにクライアントがあり、[クライアントの一覧](https://duckdb.org/docs/stable/clients/overview)で言語ごとのサポート段階が示されています。C#（.NET）はコミュニティが保守するクライアントで、ブラウザで動かすWebAssembly版の仕組みは[DuckDB WASMとは？ブラウザでSQL分析を実行する仕組みと実装・採用判断](/tech/details/15379/)で扱っています。

## 関連記事

- [DuckDBとは？特徴・用途とSQLite・PostgreSQLとの違いを実測で解説【1.5.6対応】](/tech/details/5741/)
- [DuckDB 2.0とは：Quackサーバーモード・新ストレージ形式と1.x系からの移行手順](/tech/details/18227/)
- [DuckDB WASMとは？ブラウザでSQL分析を実行する仕組みと実装・採用判断](/tech/details/15379/)
- [Parquetとは？読み方・仕組み・CSVとの違いをわかりやすく解説](/tech/details/5547/)
- [データ分析基盤の構築とは？5層アーキテクチャとBigQuery実装手順を技術視点で解説](/tech/details/15337/)

---

出典: [DuckDBの使い方：インストールからCLI・Python・ファイル読み込みまでの手順【1.5.6対応】](<https://www.issoh.co.jp/tech/details/15377/>)（株式会社一創）
