@carllee1983/dbcli 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +240 -49
- package/README.zh-TW.md +951 -338
- package/assets/SKILL.md +33 -5
- package/dist/cli.mjs +481 -35
- package/package.json +1 -1
package/README.zh-TW.md
CHANGED
|
@@ -1,395 +1,643 @@
|
|
|
1
|
-
# dbcli — 為 AI
|
|
1
|
+
# dbcli — 為 AI 代理設計的資料庫 CLI
|
|
2
2
|
|
|
3
|
-
[English](./README.md) | 繁體中文
|
|
3
|
+
**語言:** [English](./README.md) | [繁體中文](./README.zh-TW.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
統一的資料庫 CLI 工具,讓 AI 代理(Claude Code、Gemini、Copilot、Cursor)能安全地查詢、探索與操作資料庫。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**核心價值:** AI 代理可透過單一、具權限控管的 CLI 工具,在敏感資料保護下安全且智慧地存取專案資料庫。
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## 國際化(i18n)
|
|
10
|
+
|
|
11
|
+
dbcli 透過環境變數 `DBCLI_LANG` 支援多語系:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# 英文(預設)
|
|
15
|
+
dbcli init
|
|
16
|
+
|
|
17
|
+
# 繁體中文
|
|
18
|
+
DBCLI_LANG=zh-TW dbcli init
|
|
19
|
+
|
|
20
|
+
# 或在 .env 中設定
|
|
21
|
+
export DBCLI_LANG=zh-TW
|
|
22
|
+
dbcli init
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
**支援語言:**
|
|
26
|
+
- `en` — English(預設)
|
|
27
|
+
- `zh-TW` — 繁體中文(台灣)
|
|
28
|
+
|
|
29
|
+
所有訊息、說明文字、錯誤訊息與指令輸出會依語言設定自動切換。
|
|
10
30
|
|
|
11
|
-
**AI 代理能透過單一的、權限受控的 CLI 工具安全且智慧地訪問專案資料庫,並提供敏感資料保護。**
|
|
12
31
|
|
|
13
32
|
## 快速開始
|
|
14
33
|
|
|
15
34
|
### 安裝
|
|
16
35
|
|
|
17
|
-
|
|
36
|
+
#### 全域安裝(建議)
|
|
18
37
|
|
|
19
38
|
```bash
|
|
20
|
-
|
|
39
|
+
npm install -g @carllee1983/dbcli
|
|
40
|
+
# 或使用 Bun:bun install -g @carllee1983/dbcli
|
|
21
41
|
```
|
|
22
42
|
|
|
23
|
-
|
|
43
|
+
#### 免安裝(無需事先安裝)
|
|
24
44
|
|
|
25
45
|
```bash
|
|
26
|
-
|
|
46
|
+
npx @carllee1983/dbcli init
|
|
47
|
+
npx @carllee1983/dbcli query "SELECT * FROM users"
|
|
48
|
+
# 或使用 Bun:bunx @carllee1983/dbcli init
|
|
27
49
|
```
|
|
28
50
|
|
|
29
|
-
|
|
51
|
+
#### 更新
|
|
30
52
|
|
|
31
53
|
```bash
|
|
32
|
-
#
|
|
54
|
+
# 自我更新(建議)
|
|
33
55
|
dbcli upgrade
|
|
34
56
|
|
|
35
|
-
#
|
|
36
|
-
|
|
57
|
+
# 或透過 npm
|
|
58
|
+
npm update -g @carllee1983/dbcli
|
|
37
59
|
```
|
|
38
60
|
|
|
39
|
-
|
|
61
|
+
#### 開發安裝
|
|
40
62
|
|
|
41
63
|
```bash
|
|
42
|
-
|
|
43
|
-
dbcli
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
64
|
+
git clone https://github.com/CarlLee1983/dbcli.git
|
|
65
|
+
cd dbcli
|
|
66
|
+
bun install
|
|
67
|
+
bun run src/cli.ts -- --help
|
|
68
|
+
# 或:bun run dev -- --help
|
|
47
69
|
```
|
|
48
70
|
|
|
49
|
-
|
|
71
|
+
若 `dbcli` 未在 `PATH` 中,請使用 `bun run src/cli.ts <子指令> ...`(與 `bun run dev -- <子指令> ...` 相同)。
|
|
72
|
+
|
|
73
|
+
### 第一步
|
|
50
74
|
|
|
51
75
|
```bash
|
|
52
|
-
#
|
|
76
|
+
# 以資料庫連線初始化專案
|
|
77
|
+
dbcli init
|
|
78
|
+
|
|
79
|
+
# 具備自動補全功能的互動式 Shell
|
|
80
|
+
dbcli shell
|
|
81
|
+
|
|
82
|
+
# 列出可用資料表
|
|
53
83
|
dbcli list
|
|
54
84
|
|
|
55
|
-
#
|
|
85
|
+
# 檢視資料表結構
|
|
56
86
|
dbcli schema users
|
|
57
87
|
|
|
58
|
-
#
|
|
59
|
-
dbcli query "SELECT * FROM users
|
|
88
|
+
# 查詢資料
|
|
89
|
+
dbcli query "SELECT * FROM users"
|
|
90
|
+
|
|
91
|
+
# 修改結構 (DDL)
|
|
92
|
+
dbcli migrate create posts --column "id:int:pk" "title:varchar(100)"
|
|
60
93
|
|
|
61
|
-
#
|
|
62
|
-
dbcli
|
|
94
|
+
# 產生 AI 代理 skill
|
|
95
|
+
dbcli skill --install claude
|
|
96
|
+
```
|
|
63
97
|
|
|
64
|
-
|
|
65
|
-
dbcli update users --where "id=1" --set '{"status":"active"}'
|
|
98
|
+
---
|
|
66
99
|
|
|
67
|
-
|
|
68
|
-
dbcli delete users --where "id=1" --force
|
|
100
|
+
## 多重連線支援 (v2)
|
|
69
101
|
|
|
70
|
-
|
|
71
|
-
dbcli export "SELECT * FROM users" --format json --output users.json
|
|
72
|
-
```
|
|
102
|
+
dbcli 支援在單一專案中管理多個具名的資料庫連線。這對於管理不同環境(開發、測試、正式)或多個資料庫非常有用。
|
|
73
103
|
|
|
74
|
-
|
|
104
|
+
### 初始化具名連線
|
|
75
105
|
|
|
76
|
-
|
|
106
|
+
若要建立具名連線,請在 `init` 時使用 `--conn-name` 選項。您也可以為該連線指定自訂的 `.env` 檔案。
|
|
77
107
|
|
|
78
108
|
```bash
|
|
79
|
-
#
|
|
80
|
-
dbcli init
|
|
81
|
-
|
|
82
|
-
# 繁體中文
|
|
83
|
-
DBCLI_LANG=zh-TW dbcli init
|
|
109
|
+
# 使用 .env.staging 建立名為 staging 的連線
|
|
110
|
+
dbcli init --conn-name staging --env-file .env.staging
|
|
84
111
|
|
|
85
|
-
#
|
|
86
|
-
|
|
87
|
-
dbcli init
|
|
112
|
+
# 建立名為 prod 的正式環境連線,並使用環境變數引用
|
|
113
|
+
dbcli init --conn-name prod --env-file .env.production --use-env-refs
|
|
88
114
|
```
|
|
89
115
|
|
|
90
|
-
|
|
91
|
-
- `en` — English(英文,預設)
|
|
92
|
-
- `zh-TW` — 繁體中文(台灣)
|
|
116
|
+
### 管理連線
|
|
93
117
|
|
|
94
|
-
|
|
118
|
+
使用 `dbcli use` 指令切換連線或列出所有連線。
|
|
95
119
|
|
|
96
|
-
|
|
120
|
+
```bash
|
|
121
|
+
# 列出所有連線(* 標記目前的預設值)
|
|
122
|
+
dbcli use --list
|
|
97
123
|
|
|
98
|
-
|
|
124
|
+
# 將預設連線切換至 'staging'
|
|
125
|
+
dbcli use staging
|
|
99
126
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
- 自動解析專案 .env 檔案
|
|
103
|
-
- 將配置儲存在 `.dbcli`(JSON 格式,按資料庫系統區分)
|
|
104
|
-
- 定義粗粒度權限:Query-only / Read-Write / Admin
|
|
127
|
+
# 顯示目前的預設連線
|
|
128
|
+
dbcli use
|
|
105
129
|
|
|
106
|
-
|
|
130
|
+
# 移除連線
|
|
131
|
+
dbcli init --remove staging
|
|
107
132
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
- 支援增量架構刷新
|
|
133
|
+
# 重新命名連線
|
|
134
|
+
dbcli init --rename staging:production
|
|
135
|
+
```
|
|
112
136
|
|
|
113
|
-
###
|
|
137
|
+
### 臨時使用特定連線
|
|
114
138
|
|
|
115
|
-
|
|
116
|
-
- 尊重權限等級(Query-only 模式拒絕寫入)
|
|
117
|
-
- 返回結構化結果(便於 AI 解析)
|
|
118
|
-
- 提供有用的錯誤訊息
|
|
139
|
+
您可以使用 `--use <name>` 全域旗標,針對特定連線執行任一指令,而無需變更預設設定。
|
|
119
140
|
|
|
120
|
-
|
|
141
|
+
```bash
|
|
142
|
+
# 針對正式資料庫執行一次查詢
|
|
143
|
+
dbcli query "SELECT count(*) FROM users" --use prod
|
|
121
144
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
- 返回確認及受影響行數
|
|
145
|
+
# 檢查測試環境資料表的健康狀態
|
|
146
|
+
dbcli check users --use staging
|
|
147
|
+
```
|
|
126
148
|
|
|
127
|
-
|
|
149
|
+
---
|
|
128
150
|
|
|
129
|
-
- `dbcli export "SELECT ..." [--format json|csv]` — 導出查詢結果
|
|
130
151
|
|
|
131
|
-
|
|
152
|
+
#### `dbcli init`
|
|
132
153
|
|
|
133
|
-
|
|
134
|
-
- `dbcli blacklist column add/remove <table>.<column>` — 隱藏或顯示特定欄位
|
|
135
|
-
- `dbcli blacklist list` — 查看目前黑名單設定
|
|
136
|
-
- 欄位黑名單在查詢結果中自動省略,並顯示安全通知
|
|
137
|
-
- 可透過 `DBCLI_OVERRIDE_BLACKLIST=true` 環境變數覆蓋(僅限管理員)
|
|
154
|
+
以資料庫連線設定初始化新的 dbcli 專案。
|
|
138
155
|
|
|
139
|
-
|
|
156
|
+
**用法:**
|
|
157
|
+
```bash
|
|
158
|
+
dbcli init [OPTIONS]
|
|
159
|
+
```
|
|
140
160
|
|
|
141
|
-
|
|
142
|
-
-
|
|
143
|
-
-
|
|
161
|
+
**選項 (基本):**
|
|
162
|
+
- `--system <type>` — 資料庫系統:`postgresql`、`mysql`、`mariadb`
|
|
163
|
+
- `--host <host>` — 主機
|
|
164
|
+
- `--port <port>` — 埠號
|
|
165
|
+
- `--user <user>` — 使用者
|
|
166
|
+
- `--password <pass>` — 密碼
|
|
167
|
+
- `--name <db>` — 資料庫名稱
|
|
168
|
+
- `--permission <level>` — 權限等級:`query-only`、`read-write`、`data-admin`、`admin`
|
|
169
|
+
- `--use-env-refs` — 在設定檔中儲存環境變數名稱參照,而非實際值
|
|
170
|
+
- `--skip-test` — 略過連線測試
|
|
171
|
+
- `--no-interactive` — 非互動模式(須提供所有必要選項)
|
|
172
|
+
- `--force` — 覆寫既有設定且不詢問確認
|
|
173
|
+
|
|
174
|
+
**選項 (多重連線 v2):**
|
|
175
|
+
- `--conn-name <name>` — 建立具名連線(例如 `staging`、`prod`)
|
|
176
|
+
- `--env-file <path>` — 從指定的 `.env` 檔案載入此連線的憑證
|
|
177
|
+
- `--remove <name>` — 從設定中移除具名連線
|
|
178
|
+
- `--rename <old:new>` — 重新命名現有連線(格式:`舊名:新名`)
|
|
179
|
+
**行為:**
|
|
180
|
+
- 若存在 `.env` 會讀取(自動帶入 DATABASE_URL、DB_* 等變數)
|
|
181
|
+
- 缺少的欄位會互動提示(主機、埠、使用者、密碼、資料庫名、權限等級)
|
|
182
|
+
- 在專案根目錄建立 `.dbcli` JSON 設定檔
|
|
183
|
+
- 儲存前會測試資料庫連線
|
|
184
|
+
|
|
185
|
+
**範例:**
|
|
186
|
+
```bash
|
|
187
|
+
# 互動式初始化
|
|
188
|
+
dbcli init
|
|
144
189
|
|
|
145
|
-
|
|
190
|
+
# 多重連線設定
|
|
191
|
+
dbcli init --conn-name staging --env-file .env.staging
|
|
192
|
+
dbcli init --conn-name prod --env-file .env.production --use-env-refs
|
|
146
193
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
-
|
|
194
|
+
# 儲存環境變數參照(非互動)
|
|
195
|
+
dbcli init --use-env-refs --system mysql \
|
|
196
|
+
--env-host DB_HOST --env-port DB_PORT \
|
|
197
|
+
--env-user DB_USER --env-password DB_PASSWORD \
|
|
198
|
+
--env-database DB_DATABASE \
|
|
199
|
+
--no-interactive
|
|
200
|
+
```
|
|
150
201
|
|
|
151
|
-
|
|
202
|
+
---
|
|
152
203
|
|
|
153
|
-
dbcli
|
|
204
|
+
#### `dbcli use` (需要 v2 設定)
|
|
154
205
|
|
|
155
|
-
|
|
206
|
+
在多重連線專案中管理或切換預設資料庫連線。
|
|
156
207
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
208
|
+
**用法:**
|
|
209
|
+
```bash
|
|
210
|
+
dbcli use [連線名稱] [選項]
|
|
211
|
+
```
|
|
161
212
|
|
|
162
|
-
|
|
163
|
-
-
|
|
164
|
-
- 查詢自動限制為 1000 行(防止意外全表掃描)
|
|
213
|
+
**選項:**
|
|
214
|
+
- `--list` — 列出所有連線並顯示目前的預設值
|
|
165
215
|
|
|
166
|
-
|
|
216
|
+
**範例:**
|
|
217
|
+
```bash
|
|
218
|
+
# 顯示目前的預設連線
|
|
219
|
+
dbcli use
|
|
167
220
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
- `dbcli insert` — 插入資料
|
|
171
|
-
- `dbcli update` — 更新資料
|
|
221
|
+
# 將預設連線切換至 'prod'
|
|
222
|
+
dbcli use prod
|
|
172
223
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
224
|
+
# 列出所有連線
|
|
225
|
+
dbcli use --list
|
|
226
|
+
```
|
|
176
227
|
|
|
177
|
-
|
|
228
|
+
---
|
|
178
229
|
|
|
179
|
-
|
|
180
|
-
- 所有讀寫操作
|
|
181
|
-
- DELETE 無限制
|
|
182
|
-
- 可跳過確認(`--force`)
|
|
230
|
+
> **`--use-env-refs`:** 啟用後,設定檔會儲存環境變數名稱(例如 `{"$env": "DB_HOST"}`)而非實際值,避免將憑證寫入檔案,適合多環境與 CI/CD。連線時 dbcli 會自動從對應環境變數讀取實際值。
|
|
183
231
|
|
|
184
|
-
|
|
232
|
+
---
|
|
185
233
|
|
|
186
|
-
dbcli
|
|
234
|
+
#### `dbcli list`
|
|
187
235
|
|
|
188
|
-
|
|
236
|
+
列出已連線資料庫中的所有資料表。
|
|
237
|
+
|
|
238
|
+
**用法:**
|
|
239
|
+
```bash
|
|
240
|
+
dbcli list [OPTIONS]
|
|
241
|
+
```
|
|
189
242
|
|
|
190
|
-
|
|
243
|
+
**選項:**
|
|
244
|
+
- `--format json` — 以 JSON 輸出,而非 ASCII 表格
|
|
191
245
|
|
|
246
|
+
**範例:**
|
|
192
247
|
```bash
|
|
193
|
-
|
|
194
|
-
dbcli
|
|
195
|
-
|
|
248
|
+
# 表格(人類可讀)
|
|
249
|
+
dbcli list
|
|
250
|
+
|
|
251
|
+
# JSON(供 AI 解析)
|
|
252
|
+
dbcli list --format json
|
|
253
|
+
|
|
254
|
+
# 串接工具
|
|
255
|
+
dbcli list --format json | jq '.data[].name'
|
|
196
256
|
```
|
|
197
257
|
|
|
198
|
-
|
|
258
|
+
---
|
|
199
259
|
|
|
200
|
-
|
|
260
|
+
#### `dbcli schema [table]`
|
|
201
261
|
|
|
262
|
+
顯示資料表結構(欄位、型別、限制、外鍵)。
|
|
263
|
+
|
|
264
|
+
**用法:**
|
|
202
265
|
```bash
|
|
203
|
-
dbcli
|
|
204
|
-
dbcli
|
|
205
|
-
#
|
|
266
|
+
dbcli schema [table]
|
|
267
|
+
dbcli schema # 掃描整個資料庫並更新 .dbcli
|
|
268
|
+
dbcli schema users # 顯示 `users` 表結構
|
|
206
269
|
```
|
|
207
270
|
|
|
208
|
-
|
|
271
|
+
**選項:**
|
|
272
|
+
- `--format json` — JSON 輸出
|
|
273
|
+
- `--refresh` — 偵測並增量更新 schema 變更(需 `--force` 核准)
|
|
274
|
+
- `--reset` — 清除既有 schema 並自資料庫重新抓取(切換連線後適用)
|
|
275
|
+
- `--force` — 重新整理/覆寫/重置時略過確認
|
|
209
276
|
|
|
210
|
-
|
|
277
|
+
**範例:**
|
|
278
|
+
```bash
|
|
279
|
+
# 顯示 users 表結構
|
|
280
|
+
dbcli schema users
|
|
211
281
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
282
|
+
# JSON 與完整中繼資料
|
|
283
|
+
dbcli schema users --format json
|
|
284
|
+
|
|
285
|
+
# 增量更新 schema(新表等)
|
|
286
|
+
dbcli schema --refresh --force
|
|
287
|
+
|
|
288
|
+
# 清空後全量重抓(切換 DB 後)
|
|
289
|
+
dbcli schema --reset --force
|
|
290
|
+
|
|
291
|
+
# 掃描整個資料庫
|
|
292
|
+
dbcli schema
|
|
221
293
|
```
|
|
222
294
|
|
|
223
|
-
|
|
295
|
+
---
|
|
296
|
+
|
|
297
|
+
#### `dbcli query "SQL"`
|
|
224
298
|
|
|
225
|
-
|
|
299
|
+
執行 SQL 查詢並回傳結果。
|
|
226
300
|
|
|
301
|
+
**用法:**
|
|
227
302
|
```bash
|
|
228
|
-
|
|
303
|
+
dbcli query "SELECT * FROM users"
|
|
229
304
|
```
|
|
230
305
|
|
|
231
|
-
|
|
306
|
+
**選項:**
|
|
307
|
+
- `--format json|table|csv` — 輸出格式(預設:table)
|
|
308
|
+
- `--limit <數字>` — 限制列數(覆寫 query-only 下的自動上限)
|
|
309
|
+
- `--no-limit` — 在 query-only 模式下關閉自動 1000 列上限
|
|
232
310
|
|
|
233
|
-
|
|
311
|
+
**行為:**
|
|
312
|
+
- 依權限限制操作(Query-only 會阻擋 INSERT/UPDATE/DELETE)
|
|
313
|
+
- Query-only 模式預設自動限制最多 1000 列(並顯示提示),除非使用 `--no-limit` 或 `--limit`
|
|
314
|
+
- 回傳含中繼資料的結構化結果(列數、執行時間等)
|
|
315
|
+
- 若要將 CSV/JSON 寫入檔案,請用 shell 重新導向或 `export` 指令
|
|
234
316
|
|
|
317
|
+
**範例:**
|
|
235
318
|
```bash
|
|
236
|
-
|
|
237
|
-
|
|
319
|
+
# 表格輸出
|
|
320
|
+
dbcli query "SELECT * FROM users"
|
|
238
321
|
|
|
239
|
-
|
|
240
|
-
|
|
322
|
+
# JSON
|
|
323
|
+
dbcli query "SELECT * FROM users" --format json
|
|
241
324
|
|
|
242
|
-
|
|
243
|
-
|
|
325
|
+
# CSV 輸出至 stdout(重新導向成檔案)
|
|
326
|
+
dbcli query "SELECT * FROM users" --format csv > users.csv
|
|
244
327
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
328
|
+
# 串接其他工具
|
|
329
|
+
dbcli query "SELECT * FROM products" --format json | jq '.data[] | .name'
|
|
330
|
+
|
|
331
|
+
# 大量結果(以 LIMIT/OFFSET 分頁)
|
|
332
|
+
dbcli query "SELECT * FROM users LIMIT 100 OFFSET 0"
|
|
250
333
|
```
|
|
251
334
|
|
|
252
|
-
|
|
335
|
+
---
|
|
253
336
|
|
|
254
|
-
|
|
337
|
+
#### `dbcli insert [table]`(需要 Read-Write 或 Admin 權限)
|
|
255
338
|
|
|
256
|
-
|
|
257
|
-
dbcli list
|
|
258
|
-
# 以表格輸出
|
|
259
|
-
# ┌─────────┬──────────┬────────┐
|
|
260
|
-
# │ Table │ Rows │ Engine │
|
|
261
|
-
# ├─────────┼──────────┼────────┤
|
|
262
|
-
# │ users │ 1,250 │ InnoDB │
|
|
263
|
-
# │ posts │ 8,431 │ InnoDB │
|
|
264
|
-
# └─────────┴──────────┴────────┘
|
|
339
|
+
插入資料列。
|
|
265
340
|
|
|
266
|
-
|
|
267
|
-
|
|
341
|
+
**用法:**
|
|
342
|
+
```bash
|
|
343
|
+
dbcli insert users --data '{"name": "Alice", "email": "alice@example.com"}'
|
|
268
344
|
```
|
|
269
345
|
|
|
270
|
-
|
|
346
|
+
**選項:**
|
|
347
|
+
- `--data JSON` — 資料列 JSON 物件(**必填**)
|
|
348
|
+
- `--dry-run` — 僅顯示 SQL,不執行
|
|
349
|
+
- `--force` — 略過確認
|
|
350
|
+
|
|
351
|
+
**行為:**
|
|
352
|
+
- 驗證 JSON 格式
|
|
353
|
+
- 產生參數化 SQL(降低 SQL 注入風險)
|
|
354
|
+
- 插入前顯示確認(除非使用 `--force`)
|
|
271
355
|
|
|
356
|
+
**範例:**
|
|
272
357
|
```bash
|
|
273
|
-
|
|
274
|
-
|
|
358
|
+
# 插入一列
|
|
359
|
+
dbcli insert users --data '{"name": "Bob", "email": "bob@example.com"}'
|
|
275
360
|
|
|
276
|
-
|
|
277
|
-
|
|
361
|
+
# 預覽 SQL
|
|
362
|
+
dbcli insert users --data '{"name": "Charlie"}' --dry-run
|
|
278
363
|
|
|
279
|
-
|
|
280
|
-
|
|
364
|
+
# 略過確認
|
|
365
|
+
dbcli insert users --data '{"name": "Diana"}' --force
|
|
366
|
+
```
|
|
281
367
|
|
|
282
|
-
|
|
283
|
-
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
#### `dbcli update [table]`(需要 Read-Write 或 Admin 權限)
|
|
371
|
+
|
|
372
|
+
更新既有資料列。
|
|
373
|
+
|
|
374
|
+
**用法:**
|
|
375
|
+
```bash
|
|
376
|
+
dbcli update users --where "id=1" --set '{"name": "Alice Updated"}'
|
|
284
377
|
```
|
|
285
378
|
|
|
286
|
-
|
|
379
|
+
**選項:**
|
|
380
|
+
- `--where condition` — WHERE 條件(**必填**,例如 `"id=1 AND status='active'"`)
|
|
381
|
+
- `--set JSON` — 要更新的欄位 JSON(**必填**)
|
|
382
|
+
- `--dry-run` — 僅顯示 SQL
|
|
383
|
+
- `--force` — 略過確認
|
|
287
384
|
|
|
385
|
+
**範例:**
|
|
288
386
|
```bash
|
|
289
|
-
|
|
387
|
+
# 更新單列
|
|
388
|
+
dbcli update users --where "id=1" --set '{"name": "Alice"}'
|
|
290
389
|
|
|
291
|
-
|
|
292
|
-
|
|
390
|
+
# 更新多列
|
|
391
|
+
dbcli update users --where "status='inactive'" --set '{"status":"active"}'
|
|
293
392
|
|
|
294
|
-
|
|
295
|
-
|
|
393
|
+
# 預覽 SQL
|
|
394
|
+
dbcli update users --where "id=1" --set '{"name": "Bob"}' --dry-run
|
|
296
395
|
|
|
297
|
-
|
|
298
|
-
|
|
396
|
+
# 略過確認
|
|
397
|
+
dbcli update users --where "id=2" --set '{"email": "new@example.com"}' --force
|
|
299
398
|
```
|
|
300
399
|
|
|
301
|
-
|
|
400
|
+
---
|
|
302
401
|
|
|
303
|
-
|
|
304
|
-
dbcli insert users --data '{"name":"Bob","email":"bob@example.com"}'
|
|
402
|
+
#### `dbcli delete [table]`(需要 Data-Admin 或 Admin 權限)
|
|
305
403
|
|
|
306
|
-
|
|
404
|
+
刪除資料列(query-only 與 read-write 不可用;需較高 DML 權限)。
|
|
307
405
|
|
|
308
|
-
|
|
309
|
-
|
|
406
|
+
**用法:**
|
|
407
|
+
```bash
|
|
408
|
+
dbcli delete users --where "id=1" --force
|
|
310
409
|
```
|
|
311
410
|
|
|
312
|
-
|
|
411
|
+
**選項:**
|
|
412
|
+
- `--where condition` — WHERE 條件(**必填**)
|
|
413
|
+
- `--dry-run` — 僅顯示 SQL
|
|
414
|
+
- `--force` — 實際刪除時必填(安全閘門)
|
|
313
415
|
|
|
416
|
+
**範例:**
|
|
314
417
|
```bash
|
|
315
|
-
|
|
418
|
+
# 刪除單列(須 `--force`)
|
|
419
|
+
dbcli delete users --where "id=1" --force
|
|
316
420
|
|
|
317
|
-
|
|
421
|
+
# 預覽刪除
|
|
422
|
+
dbcli delete products --where "status='deprecated'" --dry-run
|
|
318
423
|
|
|
319
|
-
|
|
320
|
-
|
|
424
|
+
# 刪除多列
|
|
425
|
+
dbcli delete orders --where "created_at < '2020-01-01'" --force
|
|
321
426
|
```
|
|
322
427
|
|
|
323
|
-
|
|
428
|
+
---
|
|
324
429
|
|
|
325
|
-
|
|
326
|
-
# 僅限 Admin 權限
|
|
327
|
-
dbcli delete users --where "id=1"
|
|
430
|
+
#### `dbcli export "SQL"`
|
|
328
431
|
|
|
329
|
-
|
|
330
|
-
|
|
432
|
+
將查詢結果匯出至檔案。
|
|
433
|
+
|
|
434
|
+
**用法:**
|
|
435
|
+
```bash
|
|
436
|
+
dbcli export "SELECT * FROM users" --format json --output users.json
|
|
331
437
|
```
|
|
332
438
|
|
|
333
|
-
|
|
439
|
+
**選項:**
|
|
440
|
+
- `--format json|csv` — 輸出格式
|
|
441
|
+
- `--output file` — 寫入檔案(預設 stdout 供管道使用)
|
|
334
442
|
|
|
443
|
+
**行為:**
|
|
444
|
+
- Query-only 權限下每次匯出最多 1000 列
|
|
445
|
+
- 產生符合 RFC 4180 的 CSV
|
|
446
|
+
- 產生結構良好的 JSON 陣列
|
|
447
|
+
|
|
448
|
+
**範例:**
|
|
335
449
|
```bash
|
|
450
|
+
# 匯出 JSON
|
|
336
451
|
dbcli export "SELECT * FROM users" --format json --output users.json
|
|
337
452
|
|
|
338
|
-
|
|
453
|
+
# 匯出 CSV
|
|
454
|
+
dbcli export "SELECT * FROM orders" --format csv --output orders.csv
|
|
455
|
+
|
|
456
|
+
# 管道壓縮
|
|
457
|
+
dbcli export "SELECT * FROM products" --format csv | gzip > products.csv.gz
|
|
458
|
+
|
|
459
|
+
# 搭配 jq
|
|
460
|
+
dbcli export "SELECT * FROM users WHERE active=true" --format json | jq '.data | length'
|
|
339
461
|
```
|
|
340
462
|
|
|
341
|
-
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
#### `dbcli skill`
|
|
466
|
+
|
|
467
|
+
產生或安裝 AI 代理 skill 說明文件。
|
|
342
468
|
|
|
469
|
+
**用法:**
|
|
343
470
|
```bash
|
|
344
|
-
dbcli skill
|
|
345
|
-
#
|
|
471
|
+
dbcli skill # 輸出至 stdout
|
|
472
|
+
dbcli skill --output SKILL.md # 寫入檔案
|
|
473
|
+
dbcli skill --install claude # 安裝至 Claude Code 設定
|
|
474
|
+
dbcli skill --install gemini # 安裝至 Gemini CLI
|
|
475
|
+
dbcli skill --install copilot # 安裝至 GitHub Copilot
|
|
476
|
+
dbcli skill --install cursor # 安裝至 Cursor IDE
|
|
477
|
+
```
|
|
346
478
|
|
|
347
|
-
|
|
348
|
-
|
|
479
|
+
**行為:**
|
|
480
|
+
- 依 CLI 內省動態產生 SKILL.md
|
|
481
|
+
- 依權限等級過濾指令(Query-only 會隱藏寫入類指令)
|
|
482
|
+
- 支援 stdout、檔案、各平台安裝等輸出方式
|
|
349
483
|
|
|
484
|
+
**範例:**
|
|
485
|
+
```bash
|
|
486
|
+
# 為 Claude Code 產生 skill
|
|
350
487
|
dbcli skill --install claude
|
|
351
|
-
|
|
488
|
+
|
|
489
|
+
# 手動產生文件
|
|
490
|
+
dbcli skill > ./docs/SKILL.md
|
|
491
|
+
|
|
492
|
+
# 檢視產生的 skill(stdout)
|
|
493
|
+
dbcli skill
|
|
494
|
+
|
|
495
|
+
# 為多平台安裝
|
|
496
|
+
dbcli skill --install claude && \
|
|
497
|
+
dbcli skill --install gemini && \
|
|
498
|
+
dbcli skill --install copilot && \
|
|
499
|
+
dbcli skill --install cursor
|
|
352
500
|
```
|
|
353
501
|
|
|
354
|
-
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
#### `dbcli blacklist`
|
|
355
505
|
|
|
506
|
+
管理資料存取黑名單,阻擋 AI 代理存取敏感資料表或欄位。
|
|
507
|
+
|
|
508
|
+
**用法:**
|
|
356
509
|
```bash
|
|
357
|
-
# 查看目前黑名單
|
|
358
510
|
dbcli blacklist list
|
|
511
|
+
dbcli blacklist table add <table>
|
|
512
|
+
dbcli blacklist table remove <table>
|
|
513
|
+
dbcli blacklist column add <table>.<column>
|
|
514
|
+
dbcli blacklist column remove <table>.<column>
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
**子指令:**
|
|
359
518
|
|
|
360
|
-
|
|
519
|
+
| 子指令 | 說明 |
|
|
520
|
+
|--------|------|
|
|
521
|
+
| `dbcli blacklist list` | 顯示目前黑名單(表與欄位) |
|
|
522
|
+
| `dbcli blacklist table add <table>` | 將表加入黑名單(阻擋所有操作) |
|
|
523
|
+
| `dbcli blacklist table remove <table>` | 從黑名單移除表 |
|
|
524
|
+
| `dbcli blacklist column add <table>.<column>` | 將欄位加入黑名單(SELECT 結果中省略) |
|
|
525
|
+
| `dbcli blacklist column remove <table>.<column>` | 從黑名單移除欄位 |
|
|
526
|
+
|
|
527
|
+
**行為:**
|
|
528
|
+
- 表黑名單會阻擋該表所有操作(query、insert、update、delete)
|
|
529
|
+
- 欄位黑名單會從 SELECT 結果中靜默省略欄位,並顯示安全通知
|
|
530
|
+
- 規則存在 `.dbcli`,適用於所有權限等級
|
|
531
|
+
- 管理員可透過環境變數 `DBCLI_OVERRIDE_BLACKLIST=true` 覆蓋
|
|
532
|
+
|
|
533
|
+
**範例:**
|
|
534
|
+
```bash
|
|
535
|
+
# 檢視黑名單
|
|
536
|
+
dbcli blacklist list
|
|
537
|
+
|
|
538
|
+
# 封鎖敏感表
|
|
361
539
|
dbcli blacklist table add audit_logs
|
|
362
540
|
dbcli blacklist table add secrets_vault
|
|
363
541
|
|
|
364
|
-
#
|
|
365
|
-
dbcli blacklist table remove audit_logs
|
|
366
|
-
|
|
367
|
-
# 隱藏敏感欄位
|
|
542
|
+
# 在查詢結果中隱藏敏感欄位
|
|
368
543
|
dbcli blacklist column add users.password_hash
|
|
369
544
|
dbcli blacklist column add users.ssn
|
|
370
545
|
|
|
371
|
-
#
|
|
546
|
+
# 移除表黑名單
|
|
547
|
+
dbcli blacklist table remove audit_logs
|
|
548
|
+
|
|
549
|
+
# 移除欄位黑名單
|
|
372
550
|
dbcli blacklist column remove users.ssn
|
|
373
551
|
|
|
374
|
-
#
|
|
552
|
+
# 覆蓋黑名單(僅管理用途)
|
|
375
553
|
DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
|
|
376
554
|
```
|
|
377
555
|
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
#### `dbcli check`
|
|
559
|
+
|
|
560
|
+
執行資料品質與健康檢查。
|
|
561
|
+
|
|
562
|
+
**用法:**
|
|
563
|
+
```bash
|
|
564
|
+
dbcli check [資料表] [選項]
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
**選項:**
|
|
568
|
+
- `--all` — 檢查所有表(預設略過極大表,除非加 `--include-large`)
|
|
569
|
+
- `--include-large` — 與 `--all` 一併使用時一併檢查極大表
|
|
570
|
+
- `--checks <類型>` — 逗號分隔:`nulls`、`duplicates`、`orphans`、`emptyStrings`、`rowCount`、`size`
|
|
571
|
+
- `--sample <數字>` — 大表取樣列數(預設:`10000`)
|
|
572
|
+
- `--format json|table` — 輸出格式(預設:`json`)
|
|
573
|
+
|
|
574
|
+
**範例:**
|
|
575
|
+
```bash
|
|
576
|
+
# 檢查 users 表
|
|
577
|
+
dbcli check users
|
|
578
|
+
|
|
579
|
+
# 僅執行特定檢查
|
|
580
|
+
dbcli check orders --checks nulls,orphans --format table
|
|
581
|
+
|
|
582
|
+
# 掃描所有資料表
|
|
583
|
+
dbcli check --all
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
#### `dbcli diff`
|
|
589
|
+
|
|
590
|
+
儲存 schema 快照,或將目前資料庫與先前快照比對(表、欄位、索引)。
|
|
591
|
+
|
|
592
|
+
**用法:**
|
|
593
|
+
```bash
|
|
594
|
+
dbcli diff --snapshot ./schema-before.json
|
|
595
|
+
dbcli diff --against ./schema-before.json
|
|
596
|
+
dbcli diff --against ./schema-before.json --format table
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
**選項:**
|
|
600
|
+
- `--snapshot <path>` — 將目前 schema 寫入 JSON 檔
|
|
601
|
+
- `--against <path>` — 與已存快照比對差異
|
|
602
|
+
- `--format json|table` — 輸出格式(預設:`json`)
|
|
603
|
+
- `--config <path>` — 設定路徑(預設:`.dbcli`)
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
#### `dbcli status`
|
|
608
|
+
|
|
609
|
+
顯示不含連線憑證的設定摘要(權限、資料庫系統、黑名單筆數、設定中繼版本),適合提供給 AI 代理。
|
|
610
|
+
|
|
611
|
+
**用法:**
|
|
612
|
+
```bash
|
|
613
|
+
dbcli status
|
|
614
|
+
dbcli status --format text
|
|
615
|
+
dbcli status --format json
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
**選項:**
|
|
619
|
+
- `--format text|json` — 輸出格式(預設:`json`)
|
|
620
|
+
|
|
621
|
+
**注意:** 此指令固定讀取專案預設路徑 `.dbcli`(不使用全域 `--config` 旗標)。
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
378
625
|
#### `dbcli doctor`
|
|
379
626
|
|
|
380
|
-
|
|
627
|
+
對環境、設定、連線與資料執行診斷檢查。
|
|
381
628
|
|
|
382
629
|
```bash
|
|
383
630
|
dbcli doctor # 彩色文字輸出
|
|
384
|
-
dbcli doctor --format json # JSON
|
|
631
|
+
dbcli doctor --format json # JSON 輸出(供 AI 代理)
|
|
385
632
|
```
|
|
386
633
|
|
|
387
634
|
**檢查項目:**
|
|
388
635
|
- **環境:** Bun 版本相容性、dbcli 版本(與 npm registry 比對)
|
|
389
|
-
- **設定:**
|
|
390
|
-
- **連線與資料:**
|
|
636
|
+
- **設定:** 設定檔是否存在/有效、權限等級、黑名單完整性
|
|
637
|
+
- **連線與資料:** 資料庫連線、schema 快取新鮮度(超過 7 天警告)、大表警告(超過 100 萬列)
|
|
391
638
|
|
|
392
|
-
**選項:** `--format <text|json>`
|
|
639
|
+
**選項:** `--format <text|json>`
|
|
640
|
+
**結束代碼:** 0 = 全部通過或僅警告,1 = 有錯誤
|
|
393
641
|
|
|
394
642
|
---
|
|
395
643
|
|
|
@@ -398,10 +646,10 @@ dbcli doctor --format json # JSON 輸出供 AI agent 使用
|
|
|
398
646
|
產生 shell 自動補全腳本。
|
|
399
647
|
|
|
400
648
|
```bash
|
|
401
|
-
dbcli completion bash #
|
|
402
|
-
dbcli completion zsh #
|
|
403
|
-
dbcli completion fish #
|
|
404
|
-
dbcli completion --install # 自動偵測 shell
|
|
649
|
+
dbcli completion bash # bash 補全輸出至 stdout
|
|
650
|
+
dbcli completion zsh # zsh
|
|
651
|
+
dbcli completion fish # fish
|
|
652
|
+
dbcli completion --install # 自動偵測 shell 並寫入 rc
|
|
405
653
|
dbcli completion --install zsh # 指定 shell 安裝
|
|
406
654
|
```
|
|
407
655
|
|
|
@@ -411,203 +659,568 @@ dbcli completion --install zsh # 指定 shell 安裝
|
|
|
411
659
|
|
|
412
660
|
#### `dbcli upgrade`
|
|
413
661
|
|
|
414
|
-
|
|
662
|
+
檢查更新並自我升級 dbcli。
|
|
663
|
+
|
|
664
|
+
```bash
|
|
665
|
+
dbcli upgrade # 有新版則升級
|
|
666
|
+
dbcli upgrade --check # 僅檢查,不安裝
|
|
667
|
+
```
|
|
668
|
+
|
|
669
|
+
**選項:** `--check` — 只檢查,不安裝
|
|
670
|
+
**背景檢查:** dbcli 每 24 小時會靜默查詢 npm registry 一次;若有新版,會在指令輸出結束後顯示提示。
|
|
671
|
+
|
|
672
|
+
#### `dbcli shell`
|
|
415
673
|
|
|
674
|
+
互動式資料庫 shell:執行 SQL、自動補全、語法高亮。
|
|
675
|
+
|
|
676
|
+
**用法:**
|
|
416
677
|
```bash
|
|
417
|
-
dbcli
|
|
418
|
-
dbcli
|
|
678
|
+
dbcli shell # 互動模式(SQL + dbcli 指令)
|
|
679
|
+
dbcli shell --sql # 僅 SQL 模式
|
|
419
680
|
```
|
|
420
681
|
|
|
421
|
-
|
|
682
|
+
**Shell 內:**
|
|
683
|
+
- 以 `;` 結尾的 SQL 會執行
|
|
684
|
+
- 可輸入 dbcli 子指令且不需 `dbcli` 前綴(例如 `schema users`、`list`)
|
|
685
|
+
- Tab 可觸發情境式補全(SQL 關鍵字、表/欄位名)
|
|
686
|
+
- `.help` 可查看 meta 指令(`.quit`、`.clear`、`.format`、`.history`、`.timing`)
|
|
687
|
+
- 多行 SQL:輸入會累積直到出現 `;`
|
|
688
|
+
- 歷史記錄跨工作階段保存在 `~/.dbcli_history`
|
|
689
|
+
|
|
690
|
+
**權限:** 繼承設定檔;SQL 與子指令皆受權限/黑名單約束。
|
|
691
|
+
|
|
692
|
+
#### `dbcli migrate`
|
|
693
|
+
|
|
694
|
+
Schema DDL 操作。**所有子指令預設為 dry-run** — 實際執行 SQL 請加 `--execute`。
|
|
695
|
+
|
|
696
|
+
**用法:**
|
|
697
|
+
```bash
|
|
698
|
+
# 建立表
|
|
699
|
+
dbcli migrate create posts \
|
|
700
|
+
--column "id:serial:pk" \
|
|
701
|
+
--column "title:varchar(200):not-null" \
|
|
702
|
+
--column "body:text" \
|
|
703
|
+
--column "created_at:timestamp:default=now()"
|
|
704
|
+
|
|
705
|
+
# 執行(真正跑 SQL)
|
|
706
|
+
dbcli migrate create posts --column "id:serial:pk" --execute
|
|
707
|
+
|
|
708
|
+
# 刪表(破壞性 — 需 `--execute --force`)
|
|
709
|
+
dbcli migrate drop posts --execute --force
|
|
710
|
+
|
|
711
|
+
# 欄位操作
|
|
712
|
+
dbcli migrate add-column users bio text --nullable --execute
|
|
713
|
+
dbcli migrate alter-column users name --type "varchar(200)" --execute
|
|
714
|
+
dbcli migrate alter-column users email --rename user_email --execute
|
|
715
|
+
dbcli migrate drop-column users temp_field --execute --force
|
|
716
|
+
|
|
717
|
+
# 索引
|
|
718
|
+
dbcli migrate add-index users --columns email --unique --execute
|
|
719
|
+
dbcli migrate drop-index idx_users_email --table users --execute --force
|
|
720
|
+
|
|
721
|
+
# 限制條件
|
|
722
|
+
dbcli migrate add-constraint orders --fk user_id --references users.id --on-delete cascade --execute
|
|
723
|
+
dbcli migrate add-constraint users --unique email --execute
|
|
724
|
+
dbcli migrate add-constraint users --check "age >= 0" --execute
|
|
725
|
+
dbcli migrate drop-constraint orders fk_orders_user_id --execute --force
|
|
726
|
+
|
|
727
|
+
# 列舉型別(僅 PostgreSQL)
|
|
728
|
+
dbcli migrate add-enum status active inactive suspended --execute
|
|
729
|
+
dbcli migrate alter-enum status --add-value archived --execute
|
|
730
|
+
dbcli migrate drop-enum status --execute --force
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
**欄位規格格式:** `name:type[:modifier...]` — 修飾子:`pk`、`not-null`、`unique`、`auto-increment`、`default=<value>`、`references=<table>.<column>`
|
|
734
|
+
|
|
735
|
+
**選項(各子指令):** `--execute`(執行 SQL)、`--force`(DROP 時略過確認)、`--config <path>`
|
|
736
|
+
**權限:** 僅 admin
|
|
737
|
+
|
|
738
|
+
---
|
|
422
739
|
|
|
423
740
|
## 全域選項
|
|
424
741
|
|
|
425
|
-
|
|
742
|
+
所有指令皆支援下列全域選項:
|
|
426
743
|
|
|
427
|
-
|
|
|
744
|
+
| 旗標 | 說明 |
|
|
428
745
|
|------|------|
|
|
429
|
-
| `--config <path>` |
|
|
430
|
-
| `-v, --verbose` |
|
|
431
|
-
| `-q, --quiet` |
|
|
432
|
-
| `--no-color` |
|
|
746
|
+
| `--config <path>` | `.dbcli` 設定檔路徑(預設:`.dbcli`) |
|
|
747
|
+
| `-v, --verbose` | 提高詳細度(`-v` 詳細、`-vv` 除錯) |
|
|
748
|
+
| `-q, --quiet` | 抑制非必要輸出 |
|
|
749
|
+
| `--no-color` | 關閉彩色輸出(亦遵守 `NO_COLOR` 環境變數) |
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
## 內部機制與策略
|
|
754
|
+
|
|
755
|
+
### Schema 更新策略
|
|
756
|
+
|
|
757
|
+
dbcli 會在您的 `.dbcli` 設定檔中維護一份 Schema 快照。這讓 AI 代理無需頻繁連網即可理解資料庫結構。了解此快取何時更新至關重要:
|
|
758
|
+
|
|
759
|
+
1. **手動更新:**
|
|
760
|
+
* `dbcli schema`:執行全量資料庫掃描。
|
|
761
|
+
* `dbcli schema --refresh`:增量更新。偵測變更並僅更新受影響的資料表。
|
|
762
|
+
* `dbcli schema --reset`:清除快取並重新抓取所有內容。
|
|
763
|
+
2. **自動更新 (DDL):**
|
|
764
|
+
* 當您透過 `dbcli migrate` 執行 DDL 指令(例如 `add-column`)時,CLI 會在成功執行後自動重新掃描該資料表,並更新 `.dbcli` 中的快照。
|
|
765
|
+
3. **即時驗證(不存入快取):**
|
|
766
|
+
* `insert`、`update`、`delete` 與 `check` 等指令在執行前會立即從資料庫抓取最新 Schema 以確保資料完整性,但它們**不會**更新 `.dbcli` 中的長期快照。
|
|
767
|
+
|
|
768
|
+
> **注意:** 若您使用外部工具(如 DBeaver 或遷移腳本)變更資料庫結構,您**必須**執行 `dbcli schema --refresh` 同步快照,AI 代理才能看到變更。
|
|
769
|
+
|
|
770
|
+
### `dbcli migrate` 的原理
|
|
771
|
+
|
|
772
|
+
`migrate` 指令遵循嚴格的安全流程,以防止意外損壞資料庫:
|
|
773
|
+
|
|
774
|
+
1. **權限檢查:** 驗證使用者是否具備 `admin` 權限。其他等級皆無法執行 DDL。
|
|
775
|
+
2. **黑名單檢查:** 確保操作目標未包含在安全黑名單中。
|
|
776
|
+
3. **資料庫方言生成:** `DDLGenerator` 會根據您的系統將請求轉換為正確的 SQL:
|
|
777
|
+
* **PostgreSQL:** 使用 `SERIAL`、原生 `ENUM` 型別以及雙引號識別字。
|
|
778
|
+
* **MySQL/MariaDB:** 使用 `AUTO_INCREMENT`、行內 `ENUM` 定義以及反引號識別字。
|
|
779
|
+
4. **測試執行 (預設):** 所有指令預設僅輸出產生的 SQL 供審核,不實際執行。
|
|
780
|
+
5. **執行與確認:**
|
|
781
|
+
* 需要加上 `--execute` 旗標才會執行。
|
|
782
|
+
* 破壞性操作(如 `drop`)需要同時具備 `--execute` 與 `--force`。
|
|
783
|
+
6. **快照同步:** 成功執行後,會自動觸發該資料表的 Schema 更新,保持 `.dbcli` 檔案為最新狀態。
|
|
784
|
+
|
|
785
|
+
---
|
|
786
|
+
|
|
787
|
+
## 權限模型
|
|
788
|
+
|
|
789
|
+
dbcli 採用粗粒度權限系統,共四個等級。權限在 `dbcli init` 時設定並存於 `.dbcli`。黑名單與權限並行,針對敏感表與欄位提供細部保護(見[資料存取控制](#資料存取控制))。
|
|
790
|
+
|
|
791
|
+
### 權限等級
|
|
792
|
+
|
|
793
|
+
| 等級 | 允許的指令 | 阻擋的指令 | 適用情境 |
|
|
794
|
+
|------|------------|------------|----------|
|
|
795
|
+
| **Query-only** | `init`、`list`、`schema`、`query`、`export`(最多 1000 列) | `insert`、`update`、`delete`、`migrate` | 唯讀 AI 代理、分析、報表 |
|
|
796
|
+
| **Read-Write** | 另含 `insert`、`update` | `delete`、`migrate` | 應用開發、內容管理 |
|
|
797
|
+
| **Data-Admin** | 另含 `delete` | `migrate` | 完整 DML,無 DDL |
|
|
798
|
+
| **Admin** | 含 `migrate`(DDL)在內的全部指令 | — | DBA、結構變更 |
|
|
433
799
|
|
|
434
|
-
|
|
800
|
+
### 設定
|
|
435
801
|
|
|
436
|
-
|
|
802
|
+
權限在初始化時設定:
|
|
437
803
|
|
|
438
|
-
|
|
804
|
+
```bash
|
|
805
|
+
dbcli init
|
|
806
|
+
# 提示:權限等級(query-only / read-write / data-admin / admin)
|
|
807
|
+
# 儲存於專案 .dbcli/config.json: "permission": "query-only"
|
|
808
|
+
```
|
|
809
|
+
|
|
810
|
+
### 依權限的範例
|
|
811
|
+
|
|
812
|
+
#### Query-only 模式(AI 代理)
|
|
813
|
+
```bash
|
|
814
|
+
# 允許:讀取
|
|
815
|
+
dbcli query "SELECT * FROM users"
|
|
816
|
+
dbcli schema users
|
|
817
|
+
dbcli export "SELECT * FROM orders" --format json
|
|
818
|
+
|
|
819
|
+
# 阻擋:寫入
|
|
820
|
+
dbcli insert users --data '{...}' # 錯誤:權限不足
|
|
821
|
+
dbcli delete users --where "id=1" # 錯誤:權限不足
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
#### Read-Write 模式(應用開發者)
|
|
825
|
+
```bash
|
|
826
|
+
# 允許:讀寫
|
|
827
|
+
dbcli query "SELECT * FROM users"
|
|
828
|
+
dbcli insert users --data '{"name": "Alice"}'
|
|
829
|
+
dbcli update users --where "id=1" --set '{"name": "Bob"}'
|
|
830
|
+
|
|
831
|
+
# 阻擋:刪除(須 data-admin 或 admin)
|
|
832
|
+
dbcli delete users --where "id=1" # 錯誤:read-write 無法執行 DELETE
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
#### Admin 模式(資料庫管理員)
|
|
836
|
+
```bash
|
|
837
|
+
# 允許:含 DDL 在內的全部操作
|
|
838
|
+
dbcli query "SELECT * FROM users"
|
|
839
|
+
dbcli insert users --data '{"name": "Eve"}'
|
|
840
|
+
dbcli update users --where "id=1" --set '{"status": "active"}'
|
|
841
|
+
dbcli delete users --where "id=1" --force # Data-Admin 以上可刪除
|
|
842
|
+
dbcli migrate create posts --column "id:serial:pk" --execute # 僅 Admin
|
|
843
|
+
```
|
|
844
|
+
|
|
845
|
+
### 最佳實踐
|
|
846
|
+
|
|
847
|
+
- **AI 代理:** 唯讀情境使用 Query-only,降低誤刪/誤改風險
|
|
848
|
+
- **應用程式:** 一般 CRUD 使用 Read-Write,避免誤執行 DROP TABLE
|
|
849
|
+
- **維運:** 僅在結構變更、大量刪除或緊急處理時使用 Admin
|
|
850
|
+
- **最小權限:** 依實際需求給予最低足夠的權限等級
|
|
851
|
+
|
|
852
|
+
---
|
|
853
|
+
|
|
854
|
+
## 資料存取控制
|
|
855
|
+
|
|
856
|
+
黑名單與權限模型搭配,防止 AI 代理存取敏感表或欄位,不受其權限等級影響。
|
|
857
|
+
|
|
858
|
+
### 表層級黑名單
|
|
859
|
+
|
|
860
|
+
封鎖表後,查詢、插入、更新、刪除皆會被拒絕,並顯示明確錯誤。
|
|
861
|
+
|
|
862
|
+
```bash
|
|
863
|
+
dbcli blacklist table add secrets_vault
|
|
864
|
+
|
|
865
|
+
dbcli query "SELECT * FROM secrets_vault"
|
|
866
|
+
# 錯誤:表 'secrets_vault' 已列入黑名單
|
|
867
|
+
```
|
|
868
|
+
|
|
869
|
+
### 欄位層級黑名單
|
|
870
|
+
|
|
871
|
+
黑名單欄位會從 SELECT 結果中省略,輸出中會附安全通知,讓代理知道結果已被過濾。
|
|
872
|
+
|
|
873
|
+
```bash
|
|
874
|
+
dbcli blacklist column add users.password_hash
|
|
875
|
+
dbcli blacklist column add users.ssn
|
|
876
|
+
|
|
877
|
+
dbcli query "SELECT * FROM users"
|
|
878
|
+
# [Security] Columns omitted by blacklist: password_hash, ssn
|
|
879
|
+
```
|
|
880
|
+
|
|
881
|
+
### 安全通知
|
|
882
|
+
|
|
883
|
+
當黑名單過濾查詢輸出時,dbcli 會在結果中附加通知列,避免代理在不知情下依不完整資料決策。
|
|
884
|
+
|
|
885
|
+
### 以環境變數覆蓋
|
|
886
|
+
|
|
887
|
+
管理員可在緊急或維護時以 `DBCLI_OVERRIDE_BLACKLIST=true` 略過黑名單:
|
|
888
|
+
|
|
889
|
+
```bash
|
|
890
|
+
DBCLI_OVERRIDE_BLACKLIST=true dbcli query "SELECT * FROM secrets_vault"
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
此覆蓋會被記錄,僅應在必要時由管理員使用。
|
|
894
|
+
|
|
895
|
+
### 黑名單設定
|
|
896
|
+
|
|
897
|
+
規則存於 `.dbcli`,亦可手動編輯:
|
|
439
898
|
|
|
440
899
|
```json
|
|
441
900
|
{
|
|
442
|
-
"
|
|
443
|
-
"
|
|
444
|
-
"
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
"password": "secret",
|
|
448
|
-
"database": "mydb"
|
|
449
|
-
},
|
|
450
|
-
"permission": "read-write",
|
|
451
|
-
"metadata": {
|
|
452
|
-
"createdAt": "2026-03-26T12:00:00Z",
|
|
453
|
-
"tables": [
|
|
454
|
-
{
|
|
455
|
-
"name": "users",
|
|
456
|
-
"columns": [...],
|
|
457
|
-
"primaryKey": ["id"],
|
|
458
|
-
"foreignKeys": [...]
|
|
459
|
-
}
|
|
460
|
-
]
|
|
901
|
+
"blacklist": {
|
|
902
|
+
"tables": ["audit_logs", "secrets_vault"],
|
|
903
|
+
"columns": {
|
|
904
|
+
"users": ["password_hash", "ssn"]
|
|
905
|
+
}
|
|
461
906
|
}
|
|
462
907
|
}
|
|
463
908
|
```
|
|
464
909
|
|
|
465
|
-
###
|
|
910
|
+
### 黑名單與權限的關係
|
|
911
|
+
|
|
912
|
+
兩者互補:
|
|
466
913
|
|
|
467
|
-
|
|
|
468
|
-
|
|
469
|
-
|
|
|
470
|
-
|
|
|
914
|
+
| 層級 | 控制內容 | 作用範圍 |
|
|
915
|
+
|------|----------|----------|
|
|
916
|
+
| **權限模型** | 操作類型(讀/寫/刪) | 所有表 |
|
|
917
|
+
| **黑名單** | 特定表與欄位 | 敏感資料 |
|
|
471
918
|
|
|
472
|
-
|
|
919
|
+
Query-only 代理無法寫入任何表,也無法讀取黑名單表或欄位 — 兩層限制同時生效。
|
|
473
920
|
|
|
474
|
-
|
|
921
|
+
---
|
|
922
|
+
|
|
923
|
+
## AI 整合指南
|
|
924
|
+
|
|
925
|
+
dbcli 可產生供 AI 使用的 skill 文件,並可整合至常見 AI 開發工具。
|
|
926
|
+
|
|
927
|
+
### 快速開始
|
|
928
|
+
|
|
929
|
+
為慣用平台產生 skill:
|
|
475
930
|
|
|
476
931
|
```bash
|
|
477
|
-
#
|
|
478
|
-
|
|
932
|
+
# Claude Code(Anthropic VS Code 擴充)
|
|
933
|
+
dbcli skill --install claude
|
|
479
934
|
|
|
480
|
-
|
|
481
|
-
|
|
935
|
+
# Gemini CLI(Google 命令列 AI)
|
|
936
|
+
dbcli skill --install gemini
|
|
937
|
+
|
|
938
|
+
# GitHub Copilot CLI
|
|
939
|
+
dbcli skill --install copilot
|
|
940
|
+
|
|
941
|
+
# Cursor IDE
|
|
942
|
+
dbcli skill --install cursor
|
|
482
943
|
```
|
|
483
944
|
|
|
484
|
-
|
|
945
|
+
安裝後,AI 可依你的權限等級使用 dbcli 查詢、插入、更新或匯出資料。
|
|
485
946
|
|
|
486
|
-
###
|
|
947
|
+
### 各平台設定
|
|
487
948
|
|
|
488
|
-
|
|
489
|
-
Database not configured. Run: dbcli init
|
|
490
|
-
```
|
|
949
|
+
#### Claude Code(Anthropic)
|
|
491
950
|
|
|
492
|
-
|
|
951
|
+
1. 全域安裝 dbcli:`npm install -g @carllee1983/dbcli`
|
|
952
|
+
2. 初始化:`dbcli init`(選擇權限等級)
|
|
953
|
+
3. 安裝 skill:`dbcli skill --install claude`
|
|
954
|
+
4. 重新啟動 Claude Code 擴充
|
|
955
|
+
5. 在對話中詢問:「顯示資料庫 schema」或「查詢作用中使用者」
|
|
493
956
|
|
|
494
|
-
|
|
957
|
+
**Skill 路徑:** `~/.claude/skills/SKILL.md`
|
|
495
958
|
|
|
959
|
+
---
|
|
960
|
+
|
|
961
|
+
#### Gemini CLI(Google)
|
|
962
|
+
|
|
963
|
+
1. 全域安裝:`npm install -g @carllee1983/dbcli`
|
|
964
|
+
2. 初始化:`dbcli init`
|
|
965
|
+
3. 安裝 skill:`dbcli skill --install gemini`
|
|
966
|
+
4. 啟動 Gemini:`gemini start`
|
|
967
|
+
5. 在對話中請求:「查詢 users 表」或「列出資料庫資料表」
|
|
968
|
+
|
|
969
|
+
**Skill 路徑:** `~/.local/share/gemini/skills/`(Linux)或各平台對應路徑
|
|
970
|
+
|
|
971
|
+
---
|
|
972
|
+
|
|
973
|
+
#### GitHub Copilot CLI
|
|
974
|
+
|
|
975
|
+
1. 全域安裝:`npm install -g @carllee1983/dbcli`
|
|
976
|
+
2. 初始化:`dbcli init`
|
|
977
|
+
3. 安裝 skill:`dbcli skill --install copilot`
|
|
978
|
+
4. 安裝 Copilot CLI:`npm install -g @github-next/github-copilot-cli`
|
|
979
|
+
5. 使用 `copilot --help` 並探索與 dbcli 的整合
|
|
980
|
+
|
|
981
|
+
**Skill 路徑:** 依 Copilot 設定而定
|
|
982
|
+
|
|
983
|
+
---
|
|
984
|
+
|
|
985
|
+
#### Cursor IDE
|
|
986
|
+
|
|
987
|
+
1. 全域安裝:`npm install -g @carllee1983/dbcli`
|
|
988
|
+
2. 初始化:`dbcli init`
|
|
989
|
+
3. 安裝 skill:`dbcli skill --install cursor`
|
|
990
|
+
4. 開啟 Cursor
|
|
991
|
+
5. 在 Composer 中:「新增一筆使用者」或「匯出使用者資料」
|
|
992
|
+
|
|
993
|
+
**Skill 路徑:** `~/.cursor/skills/`
|
|
994
|
+
|
|
995
|
+
---
|
|
996
|
+
|
|
997
|
+
### 範例:AI 代理工作流程
|
|
998
|
+
|
|
999
|
+
**情境:** 希望 AI 分析使用者參與度。
|
|
1000
|
+
|
|
1001
|
+
```bash
|
|
1002
|
+
# 1. 安裝並初始化
|
|
1003
|
+
npm install -g @carllee1983/dbcli
|
|
1004
|
+
dbcli init # 選擇「query-only」較安全
|
|
1005
|
+
|
|
1006
|
+
# 2. 為 Claude Code 安裝 skill
|
|
1007
|
+
dbcli skill --install claude
|
|
1008
|
+
|
|
1009
|
+
# 3. 在 Claude Code 對話中:
|
|
1010
|
+
# 「分析最近 7 天的使用者活動並摘要重點」
|
|
1011
|
+
|
|
1012
|
+
# Claude Code 可能會:
|
|
1013
|
+
# - 使用:dbcli schema users、dbcli query "SELECT ..."
|
|
1014
|
+
# - 解析 JSON 輸出
|
|
1015
|
+
# - 提供分析
|
|
496
1016
|
```
|
|
497
|
-
|
|
1017
|
+
|
|
1018
|
+
### 重新整理 Skill
|
|
1019
|
+
|
|
1020
|
+
權限或設定變更後,可重新產生 skill:
|
|
1021
|
+
|
|
1022
|
+
```bash
|
|
1023
|
+
# 例如編輯 .dbcli/config.json,將 "permission" 設為 "admin"(或重新執行 dbcli init)
|
|
1024
|
+
dbcli skill # 會顯示 delete 與 migrate 等指令
|
|
1025
|
+
|
|
1026
|
+
# 再安裝一次以更新 AI 平台
|
|
1027
|
+
dbcli skill --install claude
|
|
498
1028
|
```
|
|
499
1029
|
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
1030
|
+
---
|
|
1031
|
+
|
|
1032
|
+
## 故障排除
|
|
1033
|
+
|
|
1034
|
+
### 連線問題
|
|
1035
|
+
|
|
1036
|
+
#### 「ECONNREFUSED: Connection refused」
|
|
1037
|
+
|
|
1038
|
+
資料庫未執行或主機/埠錯誤。
|
|
1039
|
+
|
|
1040
|
+
**處理方式:**
|
|
505
1041
|
|
|
506
|
-
|
|
1042
|
+
```bash
|
|
1043
|
+
# 確認資料庫是否在跑
|
|
1044
|
+
psql --version # PostgreSQL
|
|
1045
|
+
mysql --version # MySQL
|
|
1046
|
+
|
|
1047
|
+
# 檢查連線字串
|
|
1048
|
+
dbcli init # 重新初始化以確認憑證
|
|
507
1049
|
|
|
1050
|
+
# 命令列測試主機/埠
|
|
1051
|
+
psql -h localhost -U postgres
|
|
1052
|
+
mysql -h 127.0.0.1 -u root
|
|
508
1053
|
```
|
|
509
|
-
|
|
1054
|
+
|
|
1055
|
+
#### 「ENOTFOUND: getaddrinfo ENOTFOUND hostname」
|
|
1056
|
+
|
|
1057
|
+
主機名稱無法解析(拼字錯誤或 DNS 問題)。
|
|
1058
|
+
|
|
1059
|
+
**處理方式:**
|
|
1060
|
+
|
|
1061
|
+
```bash
|
|
1062
|
+
# 檢查專案設定中的 host(目錄型配置:.dbcli/config.json)
|
|
1063
|
+
grep host .dbcli/config.json
|
|
1064
|
+
|
|
1065
|
+
# 測試 DNS
|
|
1066
|
+
ping your-hostname.com
|
|
1067
|
+
|
|
1068
|
+
# 若仍有問題可改試 127.0.0.1
|
|
1069
|
+
dbcli init
|
|
510
1070
|
```
|
|
511
1071
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
- 或聯繫資料庫管理員
|
|
1072
|
+
---
|
|
1073
|
+
|
|
1074
|
+
### 權限錯誤
|
|
516
1075
|
|
|
517
|
-
|
|
1076
|
+
#### 「Permission denied: INSERT requires Read-Write or Admin」
|
|
518
1077
|
|
|
1078
|
+
在 Query-only 下嘗試寫入。
|
|
1079
|
+
|
|
1080
|
+
**處理方式:** 以較高權限重新初始化:
|
|
1081
|
+
|
|
1082
|
+
```bash
|
|
1083
|
+
rm -rf .dbcli # 移除專案設定(具破壞性 — 請先備份)
|
|
1084
|
+
dbcli init # 選擇 read-write、data-admin 或 admin
|
|
519
1085
|
```
|
|
520
|
-
|
|
1086
|
+
|
|
1087
|
+
#### 「Permission denied: DELETE operation requires Data-Admin or Admin」
|
|
1088
|
+
|
|
1089
|
+
DELETE 在 query-only 與 read-write 下不允許。
|
|
1090
|
+
|
|
1091
|
+
**處理方式:** 改用 `data-admin` 或 `admin` 權限(重新執行 `dbcli init`,或編輯 `.dbcli/config.json`),或洽管理員。
|
|
1092
|
+
|
|
1093
|
+
```bash
|
|
1094
|
+
dbcli init # 選擇 data-admin 或 admin
|
|
1095
|
+
dbcli delete users --where "id=1" --force
|
|
521
1096
|
```
|
|
522
1097
|
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
1098
|
+
---
|
|
1099
|
+
|
|
1100
|
+
### 查詢錯誤
|
|
1101
|
+
|
|
1102
|
+
#### 「Table not found: users」
|
|
1103
|
+
|
|
1104
|
+
表不存在或名稱拼錯。
|
|
527
1105
|
|
|
528
|
-
|
|
1106
|
+
**處理方式:**
|
|
529
1107
|
|
|
1108
|
+
```bash
|
|
1109
|
+
dbcli list
|
|
1110
|
+
dbcli query "SELECT * FROM user" --format json
|
|
530
1111
|
```
|
|
531
|
-
|
|
1112
|
+
|
|
1113
|
+
#### 「Syntax error near SELECT」
|
|
1114
|
+
|
|
1115
|
+
SQL 語法錯誤。
|
|
1116
|
+
|
|
1117
|
+
**處理方式:**
|
|
1118
|
+
|
|
1119
|
+
```bash
|
|
1120
|
+
# 先在原生用戶端測試
|
|
1121
|
+
psql # 或 mysql
|
|
1122
|
+
|
|
1123
|
+
# 再在 dbcli 使用
|
|
1124
|
+
dbcli query "SELECT * FROM users"
|
|
532
1125
|
```
|
|
533
1126
|
|
|
534
|
-
|
|
535
|
-
- 簡化查詢(新增 WHERE 條件、JOIN 等)
|
|
536
|
-
- 使用 `--limit` 限制行數
|
|
537
|
-
- 檢查資料庫索引是否最佳化
|
|
1127
|
+
---
|
|
538
1128
|
|
|
539
|
-
|
|
1129
|
+
### 效能問題
|
|
540
1130
|
|
|
541
|
-
|
|
542
|
-
|------|------|------|
|
|
543
|
-
| 執行時 | Bun | 快速啟動、原生 TS 支援 |
|
|
544
|
-
| 資料庫 | PostgreSQL、MySQL、MariaDB | 廣泛使用、成熟生態 |
|
|
545
|
-
| 測試 | Vitest | 快速、全面的單位 & 集成測試 |
|
|
546
|
-
| 分發 | npm | 標準 Node.js/Bun 生態 |
|
|
1131
|
+
#### 「查詢只回傳 1000 列而非完整結果」
|
|
547
1132
|
|
|
548
|
-
|
|
1133
|
+
Query-only 會自動限制列數以策安全。
|
|
549
1134
|
|
|
550
|
-
|
|
1135
|
+
**處理方式:** 提高權限或分段抓取:
|
|
551
1136
|
|
|
552
1137
|
```bash
|
|
553
|
-
#
|
|
554
|
-
git clone https://github.com/your-org/dbcli.git
|
|
555
|
-
cd dbcli
|
|
1138
|
+
dbcli init # read-write 或 admin
|
|
556
1139
|
|
|
557
|
-
#
|
|
558
|
-
|
|
1140
|
+
# 或分塊查詢
|
|
1141
|
+
dbcli query "SELECT * FROM users LIMIT 100 OFFSET 0"
|
|
1142
|
+
dbcli query "SELECT * FROM users LIMIT 100 OFFSET 100"
|
|
1143
|
+
```
|
|
559
1144
|
|
|
560
|
-
|
|
561
|
-
bun test
|
|
1145
|
+
#### 「第一次執行 CLI 超過 30 秒」
|
|
562
1146
|
|
|
563
|
-
|
|
564
|
-
bun run src/cli.ts init
|
|
565
|
-
```
|
|
1147
|
+
npx 正在下載並快取套件。
|
|
566
1148
|
|
|
567
|
-
|
|
1149
|
+
**處理方式:** 首次較慢屬正常,之後會很快:
|
|
568
1150
|
|
|
569
1151
|
```bash
|
|
570
|
-
#
|
|
571
|
-
|
|
1152
|
+
npx @carllee1983/dbcli init # 首次約 30s
|
|
1153
|
+
npx @carllee1983/dbcli init # 之後 <1s
|
|
1154
|
+
|
|
1155
|
+
# 或全域安裝
|
|
1156
|
+
npm install -g @carllee1983/dbcli
|
|
1157
|
+
dbcli init
|
|
1158
|
+
```
|
|
1159
|
+
|
|
1160
|
+
---
|
|
1161
|
+
|
|
1162
|
+
### 跨平台問題
|
|
1163
|
+
|
|
1164
|
+
#### Windows:「Command not found: dbcli」
|
|
1165
|
+
|
|
1166
|
+
npm 未建立 .cmd 或 PATH 未更新。
|
|
1167
|
+
|
|
1168
|
+
**處理方式:**
|
|
572
1169
|
|
|
573
|
-
|
|
574
|
-
|
|
1170
|
+
```bash
|
|
1171
|
+
# 重開終端機以更新 PATH
|
|
1172
|
+
# 或重新全域安裝
|
|
1173
|
+
npm uninstall -g @carllee1983/dbcli
|
|
1174
|
+
npm install -g @carllee1983/dbcli
|
|
575
1175
|
|
|
576
|
-
|
|
577
|
-
bun test --watch
|
|
1176
|
+
where dbcli
|
|
578
1177
|
```
|
|
579
1178
|
|
|
580
|
-
|
|
1179
|
+
#### macOS/Linux:「Permission denied: ./dist/cli.mjs」
|
|
1180
|
+
|
|
1181
|
+
未設定執行位元。
|
|
1182
|
+
|
|
1183
|
+
**處理方式:**
|
|
581
1184
|
|
|
582
1185
|
```bash
|
|
583
|
-
|
|
584
|
-
|
|
1186
|
+
chmod +x dist/cli.mjs
|
|
1187
|
+
./dist/cli.mjs --help
|
|
585
1188
|
```
|
|
586
1189
|
|
|
587
|
-
|
|
1190
|
+
---
|
|
588
1191
|
|
|
589
|
-
|
|
1192
|
+
## 系統需求
|
|
590
1193
|
|
|
591
|
-
###
|
|
1194
|
+
### 資料庫支援
|
|
592
1195
|
|
|
593
|
-
|
|
1196
|
+
- **PostgreSQL:** 12.0+
|
|
1197
|
+
- **MySQL:** 8.0+
|
|
1198
|
+
- **MariaDB:** 10.5+
|
|
594
1199
|
|
|
595
|
-
###
|
|
1200
|
+
### 執行環境
|
|
596
1201
|
|
|
597
|
-
|
|
1202
|
+
- **Node.js:** 18.0.0+
|
|
1203
|
+
- **Bun:** 1.3.3+
|
|
598
1204
|
|
|
599
|
-
|
|
600
|
-
2. 在命令中使用 `t()` 或 `t_vars()`
|
|
601
|
-
3. 執行測試確保一致性
|
|
1205
|
+
### 平台
|
|
602
1206
|
|
|
603
|
-
|
|
1207
|
+
- **macOS:** Intel 與 Apple Silicon
|
|
1208
|
+
- **Linux:** x86_64(Ubuntu、Debian、CentOS 等)
|
|
1209
|
+
- **Windows:** 10+(透過 npm .cmd 包裝)
|
|
1210
|
+
|
|
1211
|
+
---
|
|
604
1212
|
|
|
605
|
-
|
|
1213
|
+
## 開發
|
|
606
1214
|
|
|
607
|
-
|
|
1215
|
+
```bash
|
|
1216
|
+
bun test # 執行測試
|
|
1217
|
+
bun run build # 建置 CLI 至 dist/(發布前使用)
|
|
1218
|
+
```
|
|
608
1219
|
|
|
609
|
-
|
|
1220
|
+
完整環境、測試與發布流程見 [CONTRIBUTING.md](./CONTRIBUTING.md)。
|
|
610
1221
|
|
|
611
1222
|
---
|
|
612
1223
|
|
|
613
|
-
|
|
1224
|
+
## 授權
|
|
1225
|
+
|
|
1226
|
+
詳見專案中的 LICENSE 檔案。
|