# 開會要借投影機，還在翻整張表？用 Datasette 查器材清單

- 網址：https://blog.valenvan.uk/posts/simonw-datasette.html
- 發布日期：2026-10-30
- 測試設備：Mac mini M4 Pro（12 核、64GB）
- 專案：simonw/datasette（https://github.com/simonw/datasette），Apache-2.0 授權
- 測試版本：Datasette 1.0a41 / a8e13cc489b41f2f9a5aa691f5eb1bedf99a0e0b
- 實測影片：https://www.youtube.com/shorts/_R5lutGzXKg

## 重點摘要

- 自製120筆器材清單以台南、投影機、可借三條件篩選，找到5筆。
- 相同條件匯出CSV為5筆，逐欄與JSON查詢結果核對一致。
- 查詢不存在的維修中組合回傳0筆。
- 本次中文資料表網址在重新導向後遇到404，改用英文表名gear後查詢成功，中文欄位與內容保留。
- **結論：** 本次示範清單能篩選及匯出一致的5筆器材資料。
- **適合：** 願意先完成命令列設定，之後以網頁反覆查詢同一份清單的人。
- **不適合：** 期待開啟即用的桌面試算表，或未經設定就能預約及同步器材狀態的人。

| 實測項目 | 結果 |
|---|---|
| 原始器材 | 120筆 |
| 三條件篩選 | 5筆 |
| CSV匯出 | 5筆，逐欄與編號一致 |
| 不存在的維修中組合 | 0筆 |
| 受測Python | 3.12 |
| sqlite-utils | 4.2.1 |

下午要開會，先得找到一台能用的投影機。器材表裡混著相機、麥克風和筆電，看見「可借」還不夠，還要確認是不是放在台南。這種同時查地點、種類與狀態的工作，清單一長，就容易來回翻。Datasette 的用途，是把資料庫變成可在瀏覽器查詢的頁面；這次用自製器材資料，看看條件篩選與匯出是否對得上。

這不是實際公司的庫存，也沒有真實員工或借用紀錄。測試設備為 Mac mini M4 Pro（12 核、64GB），受測 Python 3.12、Datasette 1.0a41、sqlite-utils 4.2.1。1.0a41 是開發版，以下固定受測提交，不把其他版本的行為當成已驗證。

## 先把清單準備好

安裝與最初的資料轉換需要使用命令列。日後查資料才是在網頁裡操作；它不是下載後直接開啟 Excel 的桌面軟體。

```bash
git clone https://github.com/simonw/datasette.git
cd datasette
git checkout a8e13cc489b41f2f9a5aa691f5eb1bedf99a0e0b
python3 -m venv .venv
source .venv/bin/activate
pip install . sqlite-utils==4.2.1
datasette --version
```

想重現影片，可用下面的自製資料，不必拿公司的檔案測試。四種器材、三個地點，加上可借與已借出兩種狀態，共建立 120 筆。

```bash
python - <<'PY'
import csv
rows = []
for i in range(1, 121):
    rows.append({
        '編號': f'E{i:03}',
        '器材': ['投影機', '相機', '麥克風', '筆電'][(i-1) % 4],
        '地點': ['台南', '台北', '高雄'][(i-1)//4 % 3],
        '狀態': '可借' if (i-1)//12 % 2 == 0 else '已借出'
    })
with open('equipment.csv', 'w', encoding='utf-8', newline='') as f:
    w = csv.DictWriter(f, fieldnames=list(rows[0]))
    w.writeheader()
    w.writerows(rows)
PY
sqlite-utils insert equipment.db gear equipment.csv --csv --pk 編號
datasette equipment.db --host 127.0.0.1 --port 8001
```

開啟 `http://127.0.0.1:8001/equipment/gear`。這個網址只供自己的電腦使用，影片沒有把服務部署成公開網站。

![真實查詢頁：原始清單共有120筆器材](https://blog.valenvan.uk/img/simonw-datasette-article_1.png)

## 從整張表縮成要借的器材

查詢頁上有欄位、比較方式與輸入框。本次實際送入三個相等條件：地點是「台南」、器材是「投影機」、狀態是「可借」。這三個條件是同時成立，不是任一條件符合就算。畫面最後顯示 5 筆：E001、E025、E049、E073、E097。

![篩選後的真實結果，每筆保留器材編號、地點與狀態](https://blog.valenvan.uk/img/simonw-datasette-article_2.png)

| 實測項目 | 結果 |
| --- | --- |
| 原始器材清單 | 120 筆 |
| 台南、投影機、可借 | 5 筆 |
| 相同條件匯出 CSV | 5 筆，逐欄與編號一致 |
| 台南、投影機、維修中 | 0 筆 |

查詢結果可以從頁面的 CSV 連結匯出；要重現本次匯出條件，也可以在另一個終端機執行：

```bash
curl --get 'http://127.0.0.1:8001/equipment/gear.csv' \
  --data-urlencode '地點__exact=台南' \
  --data-urlencode '器材__exact=投影機' \
  --data-urlencode '狀態__exact=可借' \
  -o selected.csv
```

本次另外讀取 JSON 與 CSV，逐欄比對後一致。三次 HTTP 查詢合計約 0.021 秒，只是同一次的小型資料測試，不能推算大型清單或多人同時使用的速度。

## 遇到的問題與使用界線

最初將資料表命名為「器材」，測試網址在重新導向後遇到 404；改用英文表名 `gear`，中文欄位與中文內容保留，後續查詢成功。這只說明本次網址用法踩到的問題，不代表所有中文資料表都不能使用。JSON 回傳也需讀取 `rows` 欄位；教學固定版本，是為了避免照舊版範例直接解析而出錯。

查到「可借」不等於已完成借用。原始表若沒更新，查詢頁看到的也會是舊資料，因此拿到編號後仍應向管理者確認。本次沒有驗證登入權限、多人更新、預約流程或正式部署，也沒有測過它會自動追蹤器材狀態。

我的選擇是：常常要從同一份資料查不同組合，可以考慮把前置設定做好；偶爾查一次，用原本試算表的篩選功能就很合理。它真正省下的是重複翻找資料的步驟，並不替代器材管理流程。

專案：[Datasette](https://github.com/simonw/datasette)；授權：Apache-2.0。背景與安裝方式可查[官方入門文件](https://docs.datasette.io/en/stable/getting_started.html)，本文實測仍以指定開發版與本次收據為準。
