universal-db-mcp 0.1.1 → 0.3.0
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/CONTRIBUTING.md +12 -2
- package/DEPLOYMENT.md +23 -1
- package/EXAMPLES.md +182 -0
- package/README.md +23 -11
- package/dist/adapters/dm.d.ts +47 -0
- package/dist/adapters/dm.d.ts.map +1 -0
- package/dist/adapters/dm.js +336 -0
- package/dist/adapters/dm.js.map +1 -0
- package/dist/adapters/oracle.d.ts +52 -0
- package/dist/adapters/oracle.d.ts.map +1 -0
- package/dist/adapters/oracle.js +342 -0
- package/dist/adapters/oracle.js.map +1 -0
- package/dist/index.js +23 -3
- package/dist/index.js.map +1 -1
- package/dist/types/adapter.d.ts +2 -2
- package/dist/types/adapter.d.ts.map +1 -1
- package/package.json +12 -1
package/CONTRIBUTING.md
CHANGED
|
@@ -40,8 +40,18 @@
|
|
|
40
40
|
1. 在 `src/adapters/` 下创建新文件(如 `mongodb.ts`)
|
|
41
41
|
2. 实现 `DbAdapter` 接口
|
|
42
42
|
3. 在 `src/index.ts` 中添加对应的 case 分支
|
|
43
|
-
4.
|
|
44
|
-
5.
|
|
43
|
+
4. 在 `src/types/adapter.ts` 中更新类型定义
|
|
44
|
+
5. 更新 `README.md` 的支持列表
|
|
45
|
+
6. 添加相应的 npm 依赖
|
|
46
|
+
|
|
47
|
+
### 参考示例
|
|
48
|
+
|
|
49
|
+
可以参考现有的适配器实现:
|
|
50
|
+
- **MySQL** (`src/adapters/mysql.ts`) - SQL 数据库的基础模式
|
|
51
|
+
- **PostgreSQL** (`src/adapters/postgres.ts`) - 复杂的 Schema 查询
|
|
52
|
+
- **Redis** (`src/adapters/redis.ts`) - NoSQL 数据库的适配
|
|
53
|
+
- **Oracle** (`src/adapters/oracle.ts`) - 企业级数据库的完整实现
|
|
54
|
+
- **达梦** (`src/adapters/dm.ts`) - 国产数据库适配,兼容 Oracle
|
|
45
55
|
|
|
46
56
|
### 示例结构
|
|
47
57
|
|
package/DEPLOYMENT.md
CHANGED
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
"database",
|
|
31
31
|
"mysql",
|
|
32
32
|
"postgresql",
|
|
33
|
-
"redis"
|
|
33
|
+
"redis",
|
|
34
|
+
"oracle"
|
|
34
35
|
]
|
|
35
36
|
}
|
|
36
37
|
```
|
|
@@ -119,6 +120,16 @@ docker run -it \
|
|
|
119
120
|
--password password \
|
|
120
121
|
--database mydb
|
|
121
122
|
|
|
123
|
+
# Oracle 示例
|
|
124
|
+
docker run -it \
|
|
125
|
+
universal-db-mcp:latest \
|
|
126
|
+
--type oracle \
|
|
127
|
+
--host host.docker.internal \
|
|
128
|
+
--port 1521 \
|
|
129
|
+
--user system \
|
|
130
|
+
--password oracle_password \
|
|
131
|
+
--database XEPDB1
|
|
132
|
+
|
|
122
133
|
# 使用环境变量
|
|
123
134
|
docker run -it \
|
|
124
135
|
-e DB_TYPE=mysql \
|
|
@@ -270,6 +281,17 @@ GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
|
|
|
270
281
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_readonly;
|
|
271
282
|
```
|
|
272
283
|
|
|
284
|
+
**Oracle**:
|
|
285
|
+
```sql
|
|
286
|
+
-- 创建只读用户
|
|
287
|
+
CREATE USER mcp_readonly IDENTIFIED BY secure_password;
|
|
288
|
+
GRANT CREATE SESSION TO mcp_readonly;
|
|
289
|
+
GRANT SELECT ANY TABLE TO mcp_readonly;
|
|
290
|
+
|
|
291
|
+
-- 或者授予特定表的权限
|
|
292
|
+
GRANT SELECT ON schema.table_name TO mcp_readonly;
|
|
293
|
+
```
|
|
294
|
+
|
|
273
295
|
### 2. 使用环境变量存储密码
|
|
274
296
|
|
|
275
297
|
创建 `.env` 文件(不要提交到 Git):
|
package/EXAMPLES.md
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
- [MySQL 使用示例](#mysql-使用示例)
|
|
8
8
|
- [PostgreSQL 使用示例](#postgresql-使用示例)
|
|
9
9
|
- [Redis 使用示例](#redis-使用示例)
|
|
10
|
+
- [Oracle 使用示例](#oracle-使用示例)
|
|
10
11
|
- [Claude Desktop 配置示例](#claude-desktop-配置示例)
|
|
11
12
|
- [常见使用场景](#常见使用场景)
|
|
12
13
|
|
|
@@ -182,6 +183,174 @@
|
|
|
182
183
|
|
|
183
184
|
---
|
|
184
185
|
|
|
186
|
+
## Oracle 使用示例
|
|
187
|
+
|
|
188
|
+
### 基础配置(只读模式)
|
|
189
|
+
|
|
190
|
+
```json
|
|
191
|
+
{
|
|
192
|
+
"mcpServers": {
|
|
193
|
+
"oracle-db": {
|
|
194
|
+
"command": "npx",
|
|
195
|
+
"args": [
|
|
196
|
+
"universal-db-mcp",
|
|
197
|
+
"--type", "oracle",
|
|
198
|
+
"--host", "localhost",
|
|
199
|
+
"--port", "1521",
|
|
200
|
+
"--user", "system",
|
|
201
|
+
"--password", "your_password",
|
|
202
|
+
"--database", "XEPDB1"
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 使用 Service Name 连接
|
|
210
|
+
|
|
211
|
+
```json
|
|
212
|
+
{
|
|
213
|
+
"mcpServers": {
|
|
214
|
+
"oracle-prod": {
|
|
215
|
+
"command": "npx",
|
|
216
|
+
"args": [
|
|
217
|
+
"universal-db-mcp",
|
|
218
|
+
"--type", "oracle",
|
|
219
|
+
"--host", "oracle-server.example.com",
|
|
220
|
+
"--port", "1521",
|
|
221
|
+
"--user", "app_user",
|
|
222
|
+
"--password", "secure_password",
|
|
223
|
+
"--database", "ORCL"
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### 启用写入模式(谨慎使用)
|
|
231
|
+
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"mcpServers": {
|
|
235
|
+
"oracle-dev": {
|
|
236
|
+
"command": "npx",
|
|
237
|
+
"args": [
|
|
238
|
+
"universal-db-mcp",
|
|
239
|
+
"--type", "oracle",
|
|
240
|
+
"--host", "localhost",
|
|
241
|
+
"--port", "1521",
|
|
242
|
+
"--user", "dev_user",
|
|
243
|
+
"--password", "dev_password",
|
|
244
|
+
"--database", "DEVDB",
|
|
245
|
+
"--danger-allow-write"
|
|
246
|
+
]
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### 与 Claude 对话示例
|
|
253
|
+
|
|
254
|
+
**用户**: 帮我查看 EMPLOYEES 表的结构
|
|
255
|
+
|
|
256
|
+
**Claude 会自动**:
|
|
257
|
+
1. 调用 `get_table_info` 工具
|
|
258
|
+
2. 返回表的列信息、主键、索引等
|
|
259
|
+
3. 注意:Oracle 表名通常为大写
|
|
260
|
+
|
|
261
|
+
**用户**: 查询工资最高的 10 名员工
|
|
262
|
+
|
|
263
|
+
**Claude 会自动**:
|
|
264
|
+
1. 理解需求
|
|
265
|
+
2. 生成 SQL: `SELECT * FROM EMPLOYEES ORDER BY SALARY DESC FETCH FIRST 10 ROWS ONLY`
|
|
266
|
+
3. 调用 `execute_query` 工具执行
|
|
267
|
+
4. 返回结果
|
|
268
|
+
|
|
269
|
+
**用户**: 统计每个部门的员工数量
|
|
270
|
+
|
|
271
|
+
**Claude 会自动**:
|
|
272
|
+
1. 查看表结构
|
|
273
|
+
2. 生成 SQL: `SELECT DEPARTMENT_ID, COUNT(*) as EMP_COUNT FROM EMPLOYEES GROUP BY DEPARTMENT_ID`
|
|
274
|
+
3. 执行并返回结果
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
## 达梦 使用示例
|
|
279
|
+
|
|
280
|
+
### 基础配置(只读模式)
|
|
281
|
+
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"mcpServers": {
|
|
285
|
+
"dm-db": {
|
|
286
|
+
"command": "npx",
|
|
287
|
+
"args": [
|
|
288
|
+
"universal-db-mcp",
|
|
289
|
+
"--type", "dm",
|
|
290
|
+
"--host", "localhost",
|
|
291
|
+
"--port", "5236",
|
|
292
|
+
"--user", "SYSDBA",
|
|
293
|
+
"--password", "SYSDBA",
|
|
294
|
+
"--database", "DAMENG"
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**注意**: 达梦数据库驱动 `dmdb` 会作为可选依赖自动安装。如果安装失败,请手动运行:
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
npm install -g dmdb
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### 连接远程达梦数据库
|
|
308
|
+
|
|
309
|
+
```json
|
|
310
|
+
{
|
|
311
|
+
"mcpServers": {
|
|
312
|
+
"dm-prod": {
|
|
313
|
+
"command": "npx",
|
|
314
|
+
"args": [
|
|
315
|
+
"universal-db-mcp",
|
|
316
|
+
"--type", "dm",
|
|
317
|
+
"--host", "dm-server.example.com",
|
|
318
|
+
"--port", "5236",
|
|
319
|
+
"--user", "app_user",
|
|
320
|
+
"--password", "secure_password",
|
|
321
|
+
"--database", "PRODUCTION"
|
|
322
|
+
]
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 与 Claude 对话示例
|
|
329
|
+
|
|
330
|
+
**用户**: 查看数据库中的所有表
|
|
331
|
+
|
|
332
|
+
**Claude 会自动**:
|
|
333
|
+
|
|
334
|
+
1. 调用 `get_schema` 工具
|
|
335
|
+
2. 返回所有表的列表和基本信息
|
|
336
|
+
|
|
337
|
+
**用户**: 查询部门表中的所有记录
|
|
338
|
+
|
|
339
|
+
**Claude 会自动**:
|
|
340
|
+
|
|
341
|
+
1. 生成 SQL: `SELECT * FROM DEPT`
|
|
342
|
+
2. 执行查询并返回结果
|
|
343
|
+
|
|
344
|
+
**用户**: 统计每个部门的员工数量
|
|
345
|
+
|
|
346
|
+
**Claude 会自动**:
|
|
347
|
+
|
|
348
|
+
1. 理解需求
|
|
349
|
+
2. 生成 SQL: `SELECT DEPT_ID, COUNT(*) as EMP_COUNT FROM EMPLOYEES GROUP BY DEPT_ID`
|
|
350
|
+
3. 执行并返回结果
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
185
354
|
## Claude Desktop 配置示例
|
|
186
355
|
|
|
187
356
|
### 同时连接多个数据库
|
|
@@ -224,6 +393,18 @@
|
|
|
224
393
|
"--port", "6379",
|
|
225
394
|
"--password", "cache_password"
|
|
226
395
|
]
|
|
396
|
+
},
|
|
397
|
+
"oracle-warehouse": {
|
|
398
|
+
"command": "npx",
|
|
399
|
+
"args": [
|
|
400
|
+
"universal-db-mcp",
|
|
401
|
+
"--type", "oracle",
|
|
402
|
+
"--host", "oracle.example.com",
|
|
403
|
+
"--port", "1521",
|
|
404
|
+
"--user", "warehouse_user",
|
|
405
|
+
"--password", "warehouse_password",
|
|
406
|
+
"--database", "DWH"
|
|
407
|
+
]
|
|
227
408
|
}
|
|
228
409
|
}
|
|
229
410
|
}
|
|
@@ -234,6 +415,7 @@
|
|
|
234
415
|
- "在 MySQL 生产库中查询..."
|
|
235
416
|
- "从 PostgreSQL 分析库获取..."
|
|
236
417
|
- "检查 Redis 缓存中的..."
|
|
418
|
+
- "在 Oracle 数据仓库中统计..."
|
|
237
419
|
|
|
238
420
|
---
|
|
239
421
|
|
package/README.md
CHANGED
|
@@ -16,18 +16,24 @@
|
|
|
16
16
|
**MCP 数据库万能连接器** 通过 Model Context Protocol (MCP) 协议,让 Claude Desktop 成为你的数据库助手:
|
|
17
17
|
|
|
18
18
|
✅ **自然语言查询** - 用中文描述需求,Claude 自动生成并执行 SQL
|
|
19
|
+
|
|
19
20
|
✅ **智能表结构理解** - 自动获取数据库 Schema,提供精准建议
|
|
20
|
-
|
|
21
|
+
|
|
22
|
+
✅ **多数据库支持** - MySQL、PostgreSQL、Redis、Oracle、达梦 一键切换
|
|
23
|
+
|
|
21
24
|
✅ **安全第一** - 默认只读模式,防止误操作删库
|
|
25
|
+
|
|
22
26
|
✅ **开箱即用** - 无需复杂配置,一行命令启动
|
|
23
27
|
|
|
28
|
+
|
|
29
|
+
|
|
24
30
|
## 🚀 快速开始
|
|
25
31
|
|
|
26
32
|
### 前置要求
|
|
27
33
|
|
|
28
34
|
- Node.js >= 20
|
|
29
35
|
- Claude Desktop 应用
|
|
30
|
-
- 至少一个数据库实例(MySQL/PostgreSQL/Redis
|
|
36
|
+
- 至少一个数据库实例(MySQL/PostgreSQL/Redis/Oracle/达梦)
|
|
31
37
|
|
|
32
38
|
### 安装
|
|
33
39
|
|
|
@@ -100,13 +106,17 @@ Claude 会自动调用数据库工具完成查询!
|
|
|
100
106
|
|
|
101
107
|
## 📖 支持的数据库
|
|
102
108
|
|
|
103
|
-
| 数据库 | 类型参数 | 状态 |
|
|
104
|
-
|
|
105
|
-
| MySQL | `--type mysql` | ✅ 已支持 |
|
|
106
|
-
| PostgreSQL | `--type postgres` | ✅ 已支持 |
|
|
107
|
-
| Redis | `--type redis` | ✅ 已支持 |
|
|
108
|
-
|
|
|
109
|
-
|
|
|
109
|
+
| 数据库 | 类型参数 | 默认端口 | 状态 | 说明 |
|
|
110
|
+
|--------|---------|---------|------|------|
|
|
111
|
+
| MySQL | `--type mysql` | 3306 | ✅ 已支持 | - |
|
|
112
|
+
| PostgreSQL | `--type postgres` | 5432 | ✅ 已支持 | - |
|
|
113
|
+
| Redis | `--type redis` | 6379 | ✅ 已支持 | - |
|
|
114
|
+
| Oracle(12c以上) | `--type oracle` | 1521 | ✅ 已支持 | - |
|
|
115
|
+
| 达梦(DM7/DM8) | `--type dm` | 5236 | ✅ 已支持 | 驱动自动安装 |
|
|
116
|
+
| MongoDB | `--type mongo` | - | 🚧 计划中 | - |
|
|
117
|
+
| SQLite | `--type sqlite` | - | 🚧 计划中 | - |
|
|
118
|
+
|
|
119
|
+
**注意**: 达梦数据库驱动 `dmdb` 会作为可选依赖自动安装。如果安装失败,请手动运行 `npm install -g dmdb`。
|
|
110
120
|
|
|
111
121
|
## 🔧 命令行参数
|
|
112
122
|
|
|
@@ -114,7 +124,7 @@ Claude 会自动调用数据库工具完成查询!
|
|
|
114
124
|
universal-db-mcp [选项]
|
|
115
125
|
|
|
116
126
|
选项:
|
|
117
|
-
--type <db> 数据库类型 (mysql|postgres|redis)
|
|
127
|
+
--type <db> 数据库类型 (mysql|postgres|redis|oracle|dm)
|
|
118
128
|
--host <host> 数据库主机地址 (默认: localhost)
|
|
119
129
|
--port <port> 数据库端口
|
|
120
130
|
--user <user> 用户名
|
|
@@ -133,7 +143,9 @@ src/
|
|
|
133
143
|
├── adapters/ # 数据库适配器
|
|
134
144
|
│ ├── mysql.ts
|
|
135
145
|
│ ├── postgres.ts
|
|
136
|
-
│
|
|
146
|
+
│ ├── redis.ts
|
|
147
|
+
│ ├── oracle.ts
|
|
148
|
+
│ └── dm.ts
|
|
137
149
|
├── types/ # TypeScript 类型定义
|
|
138
150
|
│ └── adapter.ts
|
|
139
151
|
├── utils/ # 工具函数
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 达梦数据库适配器
|
|
3
|
+
* 达梦数据库高度兼容 Oracle,使用类似的 API 和系统视图
|
|
4
|
+
*
|
|
5
|
+
* dmdb 驱动会作为可选依赖自动安装
|
|
6
|
+
*/
|
|
7
|
+
import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
|
|
8
|
+
export declare class DMAdapter implements DbAdapter {
|
|
9
|
+
private connection;
|
|
10
|
+
private config;
|
|
11
|
+
constructor(config: {
|
|
12
|
+
host: string;
|
|
13
|
+
port: number;
|
|
14
|
+
user?: string;
|
|
15
|
+
password?: string;
|
|
16
|
+
database?: string;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* 连接到达梦数据库
|
|
20
|
+
*/
|
|
21
|
+
connect(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* 断开数据库连接
|
|
24
|
+
*/
|
|
25
|
+
disconnect(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* 执行 SQL 查询
|
|
28
|
+
*/
|
|
29
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
30
|
+
/**
|
|
31
|
+
* 获取数据库结构信息
|
|
32
|
+
*/
|
|
33
|
+
getSchema(): Promise<SchemaInfo>;
|
|
34
|
+
/**
|
|
35
|
+
* 获取单个表的详细信息
|
|
36
|
+
*/
|
|
37
|
+
private getTableInfo;
|
|
38
|
+
/**
|
|
39
|
+
* 格式化达梦数据类型
|
|
40
|
+
*/
|
|
41
|
+
private formatDMType;
|
|
42
|
+
/**
|
|
43
|
+
* 检查是否为写操作
|
|
44
|
+
*/
|
|
45
|
+
isWriteOperation(query: string): boolean;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=dm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm.d.ts","sourceRoot":"","sources":["../../src/adapters/dm.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAyB7B,qBAAa,SAAU,YAAW,SAAS;IACzC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAMZ;gBAEU,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAID;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA4D3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAoDtC;;OAEG;YACW,YAAY;IA2I1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAqCpB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CA+BzC"}
|
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 达梦数据库适配器
|
|
3
|
+
* 达梦数据库高度兼容 Oracle,使用类似的 API 和系统视图
|
|
4
|
+
*
|
|
5
|
+
* dmdb 驱动会作为可选依赖自动安装
|
|
6
|
+
*/
|
|
7
|
+
import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
|
|
8
|
+
// 动态导入 dmdb,因为它是可选依赖
|
|
9
|
+
let dmdb = null;
|
|
10
|
+
async function loadDMDB() {
|
|
11
|
+
if (dmdb) {
|
|
12
|
+
return dmdb;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
// @ts-ignore - dmdb 是可选依赖,可能未安装
|
|
16
|
+
const module = await import('dmdb');
|
|
17
|
+
dmdb = module.default || module;
|
|
18
|
+
return dmdb;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error('达梦数据库驱动未安装。\n' +
|
|
22
|
+
'请运行以下命令安装:npm install dmdb\n' +
|
|
23
|
+
'或者全局安装:npm install -g dmdb');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class DMAdapter {
|
|
27
|
+
connection = null;
|
|
28
|
+
config;
|
|
29
|
+
constructor(config) {
|
|
30
|
+
this.config = config;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* 连接到达梦数据库
|
|
34
|
+
*/
|
|
35
|
+
async connect() {
|
|
36
|
+
try {
|
|
37
|
+
const DM = await loadDMDB();
|
|
38
|
+
// 达梦数据库连接配置
|
|
39
|
+
const connectionConfig = {
|
|
40
|
+
host: this.config.host,
|
|
41
|
+
port: this.config.port || 5236, // 达梦默认端口
|
|
42
|
+
user: this.config.user,
|
|
43
|
+
password: this.config.password,
|
|
44
|
+
database: this.config.database,
|
|
45
|
+
};
|
|
46
|
+
this.connection = await DM.getConnection(connectionConfig);
|
|
47
|
+
// 测试连接
|
|
48
|
+
await this.connection.execute('SELECT 1 FROM DUAL', []);
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// 翻译常见错误
|
|
52
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
53
|
+
if (errorMessage.includes('用户名') || errorMessage.includes('密码')) {
|
|
54
|
+
throw new Error('达梦数据库连接失败: 用户名或密码无效');
|
|
55
|
+
}
|
|
56
|
+
else if (errorMessage.includes('连接') || errorMessage.includes('网络')) {
|
|
57
|
+
throw new Error('达梦数据库连接失败: 无法连接到数据库服务器,请检查主机地址和端口');
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`达梦数据库连接失败: ${errorMessage}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* 断开数据库连接
|
|
64
|
+
*/
|
|
65
|
+
async disconnect() {
|
|
66
|
+
if (this.connection) {
|
|
67
|
+
try {
|
|
68
|
+
await this.connection.close();
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
// 忽略关闭连接时的错误
|
|
72
|
+
}
|
|
73
|
+
this.connection = null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 执行 SQL 查询
|
|
78
|
+
*/
|
|
79
|
+
async executeQuery(query, params) {
|
|
80
|
+
if (!this.connection) {
|
|
81
|
+
throw new Error('数据库未连接');
|
|
82
|
+
}
|
|
83
|
+
const startTime = Date.now();
|
|
84
|
+
try {
|
|
85
|
+
// 执行查询
|
|
86
|
+
const result = await this.connection.execute(query, params || [], {
|
|
87
|
+
autoCommit: false,
|
|
88
|
+
});
|
|
89
|
+
const executionTime = Date.now() - startTime;
|
|
90
|
+
// 处理查询结果
|
|
91
|
+
if (result.rows && result.rows.length > 0) {
|
|
92
|
+
// SELECT 查询 - 将列名转换为小写
|
|
93
|
+
const rows = result.rows.map((row) => {
|
|
94
|
+
const lowerCaseRow = {};
|
|
95
|
+
for (const [key, value] of Object.entries(row)) {
|
|
96
|
+
lowerCaseRow[key.toLowerCase()] = value;
|
|
97
|
+
}
|
|
98
|
+
return lowerCaseRow;
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
rows,
|
|
102
|
+
executionTime,
|
|
103
|
+
metadata: {
|
|
104
|
+
columnCount: result.metaData?.length || 0,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else if (result.rowsAffected !== undefined && result.rowsAffected > 0) {
|
|
109
|
+
// DML 操作 (INSERT/UPDATE/DELETE)
|
|
110
|
+
return {
|
|
111
|
+
rows: [],
|
|
112
|
+
affectedRows: result.rowsAffected,
|
|
113
|
+
executionTime,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// 其他操作或空结果
|
|
118
|
+
return {
|
|
119
|
+
rows: [],
|
|
120
|
+
executionTime,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
126
|
+
if (errorMessage.includes('表') || errorMessage.includes('视图')) {
|
|
127
|
+
throw new Error('查询执行失败: 表或视图不存在');
|
|
128
|
+
}
|
|
129
|
+
else if (errorMessage.includes('约束')) {
|
|
130
|
+
throw new Error('查询执行失败: 违反唯一约束');
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`查询执行失败: ${errorMessage}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 获取数据库结构信息
|
|
137
|
+
*/
|
|
138
|
+
async getSchema() {
|
|
139
|
+
if (!this.connection) {
|
|
140
|
+
throw new Error('数据库未连接');
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
// 获取达梦数据库版本
|
|
144
|
+
const versionResult = await this.connection.execute(`SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1`, []);
|
|
145
|
+
const version = versionResult.rows?.[0]
|
|
146
|
+
? Object.values(versionResult.rows[0])[0]
|
|
147
|
+
: 'unknown';
|
|
148
|
+
// 获取当前用户
|
|
149
|
+
const userResult = await this.connection.execute('SELECT USER FROM DUAL', []);
|
|
150
|
+
const databaseName = userResult.rows?.[0]
|
|
151
|
+
? Object.values(userResult.rows[0])[0]
|
|
152
|
+
: 'unknown';
|
|
153
|
+
// 获取所有表
|
|
154
|
+
const tablesResult = await this.connection.execute(`SELECT TABLE_NAME, NUM_ROWS
|
|
155
|
+
FROM USER_TABLES
|
|
156
|
+
ORDER BY TABLE_NAME`, []);
|
|
157
|
+
const tableInfos = [];
|
|
158
|
+
if (tablesResult.rows) {
|
|
159
|
+
for (const tableRow of tablesResult.rows) {
|
|
160
|
+
const tableName = tableRow.TABLE_NAME;
|
|
161
|
+
const tableInfo = await this.getTableInfo(tableName);
|
|
162
|
+
tableInfos.push(tableInfo);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return {
|
|
166
|
+
databaseType: 'dm',
|
|
167
|
+
databaseName,
|
|
168
|
+
tables: tableInfos,
|
|
169
|
+
version,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* 获取单个表的详细信息
|
|
178
|
+
*/
|
|
179
|
+
async getTableInfo(tableName) {
|
|
180
|
+
if (!this.connection) {
|
|
181
|
+
throw new Error('数据库未连接');
|
|
182
|
+
}
|
|
183
|
+
// 获取列信息
|
|
184
|
+
const columnsResult = await this.connection.execute(`SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION,
|
|
185
|
+
DATA_SCALE, NULLABLE, DATA_DEFAULT, COLUMN_ID
|
|
186
|
+
FROM USER_TAB_COLUMNS
|
|
187
|
+
WHERE TABLE_NAME = :1
|
|
188
|
+
ORDER BY COLUMN_ID`, [tableName]);
|
|
189
|
+
const columnInfos = [];
|
|
190
|
+
if (columnsResult.rows) {
|
|
191
|
+
for (const col of columnsResult.rows) {
|
|
192
|
+
const colData = col;
|
|
193
|
+
columnInfos.push({
|
|
194
|
+
name: colData.COLUMN_NAME.toLowerCase(),
|
|
195
|
+
type: this.formatDMType(colData.DATA_TYPE, colData.DATA_LENGTH, colData.DATA_PRECISION, colData.DATA_SCALE),
|
|
196
|
+
nullable: colData.NULLABLE === 'Y',
|
|
197
|
+
defaultValue: colData.DATA_DEFAULT?.trim() || undefined,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// 获取列注释
|
|
202
|
+
const commentsResult = await this.connection.execute(`SELECT COLUMN_NAME, COMMENTS
|
|
203
|
+
FROM USER_COL_COMMENTS
|
|
204
|
+
WHERE TABLE_NAME = :1
|
|
205
|
+
AND COMMENTS IS NOT NULL`, [tableName]);
|
|
206
|
+
const commentsMap = new Map();
|
|
207
|
+
if (commentsResult.rows) {
|
|
208
|
+
for (const row of commentsResult.rows) {
|
|
209
|
+
const rowData = row;
|
|
210
|
+
commentsMap.set(rowData.COLUMN_NAME.toLowerCase(), rowData.COMMENTS);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// 将注释添加到列信息中
|
|
214
|
+
for (const col of columnInfos) {
|
|
215
|
+
if (commentsMap.has(col.name)) {
|
|
216
|
+
col.comment = commentsMap.get(col.name);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// 获取主键
|
|
220
|
+
const primaryKeysResult = await this.connection.execute(`SELECT cols.COLUMN_NAME, cols.POSITION
|
|
221
|
+
FROM USER_CONSTRAINTS cons
|
|
222
|
+
JOIN USER_CONS_COLUMNS cols
|
|
223
|
+
ON cons.CONSTRAINT_NAME = cols.CONSTRAINT_NAME
|
|
224
|
+
WHERE cons.CONSTRAINT_TYPE = 'P'
|
|
225
|
+
AND cons.TABLE_NAME = :1
|
|
226
|
+
ORDER BY cols.POSITION`, [tableName]);
|
|
227
|
+
const primaryKeys = [];
|
|
228
|
+
if (primaryKeysResult.rows) {
|
|
229
|
+
for (const row of primaryKeysResult.rows) {
|
|
230
|
+
primaryKeys.push(row.COLUMN_NAME.toLowerCase());
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// 获取索引信息
|
|
234
|
+
const indexesResult = await this.connection.execute(`SELECT i.INDEX_NAME, i.UNIQUENESS, ic.COLUMN_NAME, ic.COLUMN_POSITION
|
|
235
|
+
FROM USER_INDEXES i
|
|
236
|
+
JOIN USER_IND_COLUMNS ic
|
|
237
|
+
ON i.INDEX_NAME = ic.INDEX_NAME
|
|
238
|
+
WHERE i.TABLE_NAME = :1
|
|
239
|
+
ORDER BY i.INDEX_NAME, ic.COLUMN_POSITION`, [tableName]);
|
|
240
|
+
const indexMap = new Map();
|
|
241
|
+
if (indexesResult.rows) {
|
|
242
|
+
for (const row of indexesResult.rows) {
|
|
243
|
+
const rowData = row;
|
|
244
|
+
const indexName = rowData.INDEX_NAME;
|
|
245
|
+
// 跳过主键索引
|
|
246
|
+
if (indexName.includes('PK_') || indexName.includes('SYS_')) {
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
249
|
+
if (!indexMap.has(indexName)) {
|
|
250
|
+
indexMap.set(indexName, {
|
|
251
|
+
columns: [],
|
|
252
|
+
unique: rowData.UNIQUENESS === 'UNIQUE',
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
indexMap.get(indexName).columns.push(rowData.COLUMN_NAME.toLowerCase());
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
|
|
259
|
+
name,
|
|
260
|
+
columns: info.columns,
|
|
261
|
+
unique: info.unique,
|
|
262
|
+
}));
|
|
263
|
+
// 获取表行数估算
|
|
264
|
+
const rowCountResult = await this.connection.execute(`SELECT NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME = :1`, [tableName]);
|
|
265
|
+
const estimatedRows = rowCountResult.rows?.[0]
|
|
266
|
+
? (rowCountResult.rows[0].NUM_ROWS || 0)
|
|
267
|
+
: 0;
|
|
268
|
+
return {
|
|
269
|
+
name: tableName.toLowerCase(),
|
|
270
|
+
columns: columnInfos,
|
|
271
|
+
primaryKeys,
|
|
272
|
+
indexes: indexInfos,
|
|
273
|
+
estimatedRows,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 格式化达梦数据类型
|
|
278
|
+
*/
|
|
279
|
+
formatDMType(dataType, length, precision, scale) {
|
|
280
|
+
switch (dataType) {
|
|
281
|
+
case 'NUMBER':
|
|
282
|
+
case 'NUMERIC':
|
|
283
|
+
case 'DECIMAL':
|
|
284
|
+
if (precision !== null && precision !== undefined) {
|
|
285
|
+
if (scale !== null && scale !== undefined && scale > 0) {
|
|
286
|
+
return `${dataType}(${precision},${scale})`;
|
|
287
|
+
}
|
|
288
|
+
return `${dataType}(${precision})`;
|
|
289
|
+
}
|
|
290
|
+
return dataType;
|
|
291
|
+
case 'VARCHAR':
|
|
292
|
+
case 'VARCHAR2':
|
|
293
|
+
case 'CHAR':
|
|
294
|
+
if (length) {
|
|
295
|
+
return `${dataType}(${length})`;
|
|
296
|
+
}
|
|
297
|
+
return dataType;
|
|
298
|
+
case 'TIMESTAMP':
|
|
299
|
+
if (scale !== null && scale !== undefined) {
|
|
300
|
+
return `TIMESTAMP(${scale})`;
|
|
301
|
+
}
|
|
302
|
+
return 'TIMESTAMP';
|
|
303
|
+
default:
|
|
304
|
+
return dataType;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* 检查是否为写操作
|
|
309
|
+
*/
|
|
310
|
+
isWriteOperation(query) {
|
|
311
|
+
// 首先使用通用的写操作检测
|
|
312
|
+
if (checkWriteOperation(query)) {
|
|
313
|
+
return true;
|
|
314
|
+
}
|
|
315
|
+
// 添加达梦特定的写操作检测(类似 Oracle)
|
|
316
|
+
const trimmedQuery = query.trim().toUpperCase();
|
|
317
|
+
// MERGE 语句(达梦支持)
|
|
318
|
+
if (trimmedQuery.startsWith('MERGE')) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
// PL/SQL 块(达梦兼容 Oracle PL/SQL)
|
|
322
|
+
if (trimmedQuery.startsWith('BEGIN') || trimmedQuery.startsWith('DECLARE')) {
|
|
323
|
+
return true;
|
|
324
|
+
}
|
|
325
|
+
// CALL 存储过程
|
|
326
|
+
if (trimmedQuery.startsWith('CALL')) {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
// 事务控制语句
|
|
330
|
+
if (trimmedQuery.startsWith('COMMIT') || trimmedQuery.startsWith('ROLLBACK')) {
|
|
331
|
+
return true;
|
|
332
|
+
}
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
//# sourceMappingURL=dm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dm.js","sourceRoot":"","sources":["../../src/adapters/dm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle 数据库适配器
|
|
3
|
+
* 使用 oracledb 驱动实现 DbAdapter 接口
|
|
4
|
+
*/
|
|
5
|
+
import type { DbAdapter, QueryResult, SchemaInfo } from '../types/adapter.js';
|
|
6
|
+
export declare class OracleAdapter implements DbAdapter {
|
|
7
|
+
private connection;
|
|
8
|
+
private config;
|
|
9
|
+
constructor(config: {
|
|
10
|
+
host: string;
|
|
11
|
+
port: number;
|
|
12
|
+
user?: string;
|
|
13
|
+
password?: string;
|
|
14
|
+
database?: string;
|
|
15
|
+
serviceName?: string;
|
|
16
|
+
sid?: string;
|
|
17
|
+
connectString?: string;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* 构建 Oracle 连接字符串
|
|
21
|
+
*/
|
|
22
|
+
private buildConnectionString;
|
|
23
|
+
/**
|
|
24
|
+
* 连接到 Oracle 数据库
|
|
25
|
+
*/
|
|
26
|
+
connect(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* 断开数据库连接
|
|
29
|
+
*/
|
|
30
|
+
disconnect(): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* 执行 SQL 查询
|
|
33
|
+
*/
|
|
34
|
+
executeQuery(query: string, params?: unknown[]): Promise<QueryResult>;
|
|
35
|
+
/**
|
|
36
|
+
* 获取数据库结构信息
|
|
37
|
+
*/
|
|
38
|
+
getSchema(): Promise<SchemaInfo>;
|
|
39
|
+
/**
|
|
40
|
+
* 获取单个表的详细信息
|
|
41
|
+
*/
|
|
42
|
+
private getTableInfo;
|
|
43
|
+
/**
|
|
44
|
+
* 格式化 Oracle 数据类型
|
|
45
|
+
*/
|
|
46
|
+
private formatOracleType;
|
|
47
|
+
/**
|
|
48
|
+
* 检查是否为写操作
|
|
49
|
+
*/
|
|
50
|
+
isWriteOperation(query: string): boolean;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=oracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/adapters/oracle.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EAIX,MAAM,qBAAqB,CAAC;AAG7B,qBAAa,aAAc,YAAW,SAAS;IAC7C,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,MAAM,CASZ;gBAEU,MAAM,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;IAOD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAkB7B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAWjC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC;IA6D3E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC;IAoDtC;;OAEG;YACW,YAAY;IAkJ1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkCxB;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;CA+BzC"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle 数据库适配器
|
|
3
|
+
* 使用 oracledb 驱动实现 DbAdapter 接口
|
|
4
|
+
*/
|
|
5
|
+
import oracledb from 'oracledb';
|
|
6
|
+
import { isWriteOperation as checkWriteOperation } from '../utils/safety.js';
|
|
7
|
+
export class OracleAdapter {
|
|
8
|
+
connection = null;
|
|
9
|
+
config;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
// 配置 oracledb 全局设置
|
|
13
|
+
oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;
|
|
14
|
+
oracledb.fetchAsString = [oracledb.CLOB];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 构建 Oracle 连接字符串
|
|
18
|
+
*/
|
|
19
|
+
buildConnectionString() {
|
|
20
|
+
// 优先级: connectString > serviceName > sid > database
|
|
21
|
+
if (this.config.connectString) {
|
|
22
|
+
return this.config.connectString;
|
|
23
|
+
}
|
|
24
|
+
const host = this.config.host;
|
|
25
|
+
const port = this.config.port || 1521;
|
|
26
|
+
const service = this.config.serviceName || this.config.sid || this.config.database;
|
|
27
|
+
if (!service) {
|
|
28
|
+
throw new Error('必须提供 database、serviceName 或 sid');
|
|
29
|
+
}
|
|
30
|
+
// 构建 Easy Connect 字符串
|
|
31
|
+
return `${host}:${port}/${service}`;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 连接到 Oracle 数据库
|
|
35
|
+
*/
|
|
36
|
+
async connect() {
|
|
37
|
+
try {
|
|
38
|
+
const connectionString = this.buildConnectionString();
|
|
39
|
+
this.connection = await oracledb.getConnection({
|
|
40
|
+
user: this.config.user,
|
|
41
|
+
password: this.config.password,
|
|
42
|
+
connectString: connectionString,
|
|
43
|
+
});
|
|
44
|
+
// 测试连接
|
|
45
|
+
await this.connection.execute('SELECT 1 FROM DUAL');
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
// 翻译常见的 Oracle 错误
|
|
49
|
+
if (error.errorNum === 1017) {
|
|
50
|
+
throw new Error('Oracle 连接失败: 用户名或密码无效');
|
|
51
|
+
}
|
|
52
|
+
else if (error.errorNum === 12154) {
|
|
53
|
+
throw new Error('Oracle 连接失败: 无法解析连接标识符,请检查 TNS 配置');
|
|
54
|
+
}
|
|
55
|
+
else if (error.errorNum === 12541) {
|
|
56
|
+
throw new Error('Oracle 连接失败: TNS 无监听程序');
|
|
57
|
+
}
|
|
58
|
+
throw new Error(`Oracle 连接失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 断开数据库连接
|
|
63
|
+
*/
|
|
64
|
+
async disconnect() {
|
|
65
|
+
if (this.connection) {
|
|
66
|
+
try {
|
|
67
|
+
await this.connection.close();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
// 忽略关闭连接时的错误
|
|
71
|
+
}
|
|
72
|
+
this.connection = null;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 执行 SQL 查询
|
|
77
|
+
*/
|
|
78
|
+
async executeQuery(query, params) {
|
|
79
|
+
if (!this.connection) {
|
|
80
|
+
throw new Error('数据库未连接');
|
|
81
|
+
}
|
|
82
|
+
const startTime = Date.now();
|
|
83
|
+
try {
|
|
84
|
+
// 执行查询,autoCommit 设置为 false(只读安全)
|
|
85
|
+
const result = await this.connection.execute(query, params || [], {
|
|
86
|
+
autoCommit: false,
|
|
87
|
+
outFormat: oracledb.OUT_FORMAT_OBJECT,
|
|
88
|
+
});
|
|
89
|
+
const executionTime = Date.now() - startTime;
|
|
90
|
+
// 处理查询结果
|
|
91
|
+
if (result.rows && result.rows.length > 0) {
|
|
92
|
+
// SELECT 查询 - 将列名转换为小写
|
|
93
|
+
const rows = result.rows.map((row) => {
|
|
94
|
+
const lowerCaseRow = {};
|
|
95
|
+
for (const [key, value] of Object.entries(row)) {
|
|
96
|
+
lowerCaseRow[key.toLowerCase()] = value;
|
|
97
|
+
}
|
|
98
|
+
return lowerCaseRow;
|
|
99
|
+
});
|
|
100
|
+
return {
|
|
101
|
+
rows,
|
|
102
|
+
executionTime,
|
|
103
|
+
metadata: {
|
|
104
|
+
columnCount: result.metaData?.length || 0,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
else if (result.rowsAffected !== undefined && result.rowsAffected > 0) {
|
|
109
|
+
// DML 操作 (INSERT/UPDATE/DELETE)
|
|
110
|
+
return {
|
|
111
|
+
rows: [],
|
|
112
|
+
affectedRows: result.rowsAffected,
|
|
113
|
+
executionTime,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
// 其他操作或空结果
|
|
118
|
+
return {
|
|
119
|
+
rows: [],
|
|
120
|
+
executionTime,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
// 翻译常见的 Oracle 错误
|
|
126
|
+
if (error.errorNum === 942) {
|
|
127
|
+
throw new Error('查询执行失败: 表或视图不存在');
|
|
128
|
+
}
|
|
129
|
+
else if (error.errorNum === 1) {
|
|
130
|
+
throw new Error('查询执行失败: 违反唯一约束');
|
|
131
|
+
}
|
|
132
|
+
throw new Error(`查询执行失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 获取数据库结构信息
|
|
137
|
+
*/
|
|
138
|
+
async getSchema() {
|
|
139
|
+
if (!this.connection) {
|
|
140
|
+
throw new Error('数据库未连接');
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
// 获取 Oracle 版本
|
|
144
|
+
const versionResult = await this.connection.execute(`SELECT banner FROM v$version WHERE banner LIKE 'Oracle%'`);
|
|
145
|
+
const version = versionResult.rows?.[0]
|
|
146
|
+
? Object.values(versionResult.rows[0])[0]
|
|
147
|
+
: 'unknown';
|
|
148
|
+
// 获取当前用户
|
|
149
|
+
const userResult = await this.connection.execute('SELECT USER FROM DUAL');
|
|
150
|
+
const databaseName = userResult.rows?.[0]
|
|
151
|
+
? Object.values(userResult.rows[0])[0]
|
|
152
|
+
: 'unknown';
|
|
153
|
+
// 获取所有表
|
|
154
|
+
const tablesResult = await this.connection.execute(`SELECT table_name, num_rows, tablespace_name
|
|
155
|
+
FROM all_tables
|
|
156
|
+
WHERE owner = USER
|
|
157
|
+
AND temporary = 'N'
|
|
158
|
+
ORDER BY table_name`);
|
|
159
|
+
const tableInfos = [];
|
|
160
|
+
if (tablesResult.rows) {
|
|
161
|
+
for (const tableRow of tablesResult.rows) {
|
|
162
|
+
const tableName = tableRow.TABLE_NAME;
|
|
163
|
+
const tableInfo = await this.getTableInfo(tableName);
|
|
164
|
+
tableInfos.push(tableInfo);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
databaseType: 'oracle',
|
|
169
|
+
databaseName,
|
|
170
|
+
tables: tableInfos,
|
|
171
|
+
version,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
throw new Error(`获取数据库结构失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 获取单个表的详细信息
|
|
180
|
+
*/
|
|
181
|
+
async getTableInfo(tableName) {
|
|
182
|
+
if (!this.connection) {
|
|
183
|
+
throw new Error('数据库未连接');
|
|
184
|
+
}
|
|
185
|
+
// 获取列信息
|
|
186
|
+
const columnsResult = await this.connection.execute(`SELECT column_name, data_type, data_length, data_precision,
|
|
187
|
+
data_scale, nullable, data_default, column_id
|
|
188
|
+
FROM all_tab_columns
|
|
189
|
+
WHERE owner = USER
|
|
190
|
+
AND table_name = :tableName
|
|
191
|
+
ORDER BY column_id`, [tableName]);
|
|
192
|
+
const columnInfos = [];
|
|
193
|
+
if (columnsResult.rows) {
|
|
194
|
+
for (const col of columnsResult.rows) {
|
|
195
|
+
const colData = col;
|
|
196
|
+
columnInfos.push({
|
|
197
|
+
name: colData.COLUMN_NAME.toLowerCase(),
|
|
198
|
+
type: this.formatOracleType(colData.DATA_TYPE, colData.DATA_LENGTH, colData.DATA_PRECISION, colData.DATA_SCALE),
|
|
199
|
+
nullable: colData.NULLABLE === 'Y',
|
|
200
|
+
defaultValue: colData.DATA_DEFAULT?.trim() || undefined,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// 获取列注释
|
|
205
|
+
const commentsResult = await this.connection.execute(`SELECT column_name, comments
|
|
206
|
+
FROM all_col_comments
|
|
207
|
+
WHERE owner = USER
|
|
208
|
+
AND table_name = :tableName
|
|
209
|
+
AND comments IS NOT NULL`, [tableName]);
|
|
210
|
+
const commentsMap = new Map();
|
|
211
|
+
if (commentsResult.rows) {
|
|
212
|
+
for (const row of commentsResult.rows) {
|
|
213
|
+
const rowData = row;
|
|
214
|
+
commentsMap.set(rowData.COLUMN_NAME.toLowerCase(), rowData.COMMENTS);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
// 将注释添加到列信息中
|
|
218
|
+
for (const col of columnInfos) {
|
|
219
|
+
if (commentsMap.has(col.name)) {
|
|
220
|
+
col.comment = commentsMap.get(col.name);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 获取主键
|
|
224
|
+
const primaryKeysResult = await this.connection.execute(`SELECT cols.column_name, cols.position
|
|
225
|
+
FROM all_constraints cons
|
|
226
|
+
JOIN all_cons_columns cols
|
|
227
|
+
ON cons.constraint_name = cols.constraint_name
|
|
228
|
+
AND cons.owner = cols.owner
|
|
229
|
+
WHERE cons.constraint_type = 'P'
|
|
230
|
+
AND cons.owner = USER
|
|
231
|
+
AND cons.table_name = :tableName
|
|
232
|
+
ORDER BY cols.position`, [tableName]);
|
|
233
|
+
const primaryKeys = [];
|
|
234
|
+
if (primaryKeysResult.rows) {
|
|
235
|
+
for (const row of primaryKeysResult.rows) {
|
|
236
|
+
primaryKeys.push(row.COLUMN_NAME.toLowerCase());
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// 获取索引信息
|
|
240
|
+
const indexesResult = await this.connection.execute(`SELECT i.index_name, i.uniqueness, ic.column_name, ic.column_position
|
|
241
|
+
FROM all_indexes i
|
|
242
|
+
JOIN all_ind_columns ic
|
|
243
|
+
ON i.index_name = ic.index_name
|
|
244
|
+
AND i.owner = ic.index_owner
|
|
245
|
+
WHERE i.owner = USER
|
|
246
|
+
AND i.table_name = :tableName
|
|
247
|
+
AND i.index_type != 'LOB'
|
|
248
|
+
ORDER BY i.index_name, ic.column_position`, [tableName]);
|
|
249
|
+
const indexMap = new Map();
|
|
250
|
+
if (indexesResult.rows) {
|
|
251
|
+
for (const row of indexesResult.rows) {
|
|
252
|
+
const rowData = row;
|
|
253
|
+
const indexName = rowData.INDEX_NAME;
|
|
254
|
+
// 跳过主键索引
|
|
255
|
+
if (indexName.includes('PK_') || indexName.includes('SYS_')) {
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (!indexMap.has(indexName)) {
|
|
259
|
+
indexMap.set(indexName, {
|
|
260
|
+
columns: [],
|
|
261
|
+
unique: rowData.UNIQUENESS === 'UNIQUE',
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
indexMap.get(indexName).columns.push(rowData.COLUMN_NAME.toLowerCase());
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
const indexInfos = Array.from(indexMap.entries()).map(([name, info]) => ({
|
|
268
|
+
name,
|
|
269
|
+
columns: info.columns,
|
|
270
|
+
unique: info.unique,
|
|
271
|
+
}));
|
|
272
|
+
// 获取表行数估算
|
|
273
|
+
const rowCountResult = await this.connection.execute(`SELECT num_rows FROM all_tables WHERE owner = USER AND table_name = :tableName`, [tableName]);
|
|
274
|
+
const estimatedRows = rowCountResult.rows?.[0]
|
|
275
|
+
? (rowCountResult.rows[0].NUM_ROWS || 0)
|
|
276
|
+
: 0;
|
|
277
|
+
return {
|
|
278
|
+
name: tableName.toLowerCase(),
|
|
279
|
+
columns: columnInfos,
|
|
280
|
+
primaryKeys,
|
|
281
|
+
indexes: indexInfos,
|
|
282
|
+
estimatedRows,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* 格式化 Oracle 数据类型
|
|
287
|
+
*/
|
|
288
|
+
formatOracleType(dataType, length, precision, scale) {
|
|
289
|
+
switch (dataType) {
|
|
290
|
+
case 'NUMBER':
|
|
291
|
+
if (precision !== null && precision !== undefined) {
|
|
292
|
+
if (scale !== null && scale !== undefined && scale > 0) {
|
|
293
|
+
return `NUMBER(${precision},${scale})`;
|
|
294
|
+
}
|
|
295
|
+
return `NUMBER(${precision})`;
|
|
296
|
+
}
|
|
297
|
+
return 'NUMBER';
|
|
298
|
+
case 'VARCHAR2':
|
|
299
|
+
case 'CHAR':
|
|
300
|
+
if (length) {
|
|
301
|
+
return `${dataType}(${length})`;
|
|
302
|
+
}
|
|
303
|
+
return dataType;
|
|
304
|
+
case 'TIMESTAMP':
|
|
305
|
+
if (scale !== null && scale !== undefined) {
|
|
306
|
+
return `TIMESTAMP(${scale})`;
|
|
307
|
+
}
|
|
308
|
+
return 'TIMESTAMP';
|
|
309
|
+
default:
|
|
310
|
+
return dataType;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* 检查是否为写操作
|
|
315
|
+
*/
|
|
316
|
+
isWriteOperation(query) {
|
|
317
|
+
// 首先使用通用的写操作检测
|
|
318
|
+
if (checkWriteOperation(query)) {
|
|
319
|
+
return true;
|
|
320
|
+
}
|
|
321
|
+
// 添加 Oracle 特定的写操作检测
|
|
322
|
+
const trimmedQuery = query.trim().toUpperCase();
|
|
323
|
+
// MERGE 语句(Oracle 的 upsert 操作)
|
|
324
|
+
if (trimmedQuery.startsWith('MERGE')) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
// PL/SQL 块(可能包含写操作)
|
|
328
|
+
if (trimmedQuery.startsWith('BEGIN') || trimmedQuery.startsWith('DECLARE')) {
|
|
329
|
+
return true;
|
|
330
|
+
}
|
|
331
|
+
// CALL 存储过程(可能包含写操作)
|
|
332
|
+
if (trimmedQuery.startsWith('CALL')) {
|
|
333
|
+
return true;
|
|
334
|
+
}
|
|
335
|
+
// 事务控制语句
|
|
336
|
+
if (trimmedQuery.startsWith('COMMIT') || trimmedQuery.startsWith('ROLLBACK')) {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=oracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/adapters/oracle.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,12 +7,14 @@ import { DatabaseMCPServer } from './server.js';
|
|
|
7
7
|
import { MySQLAdapter } from './adapters/mysql.js';
|
|
8
8
|
import { PostgreSQLAdapter } from './adapters/postgres.js';
|
|
9
9
|
import { RedisAdapter } from './adapters/redis.js';
|
|
10
|
+
import { OracleAdapter } from './adapters/oracle.js';
|
|
11
|
+
import { DMAdapter } from './adapters/dm.js';
|
|
10
12
|
const program = new Command();
|
|
11
13
|
program
|
|
12
14
|
.name('universal-db-mcp')
|
|
13
15
|
.description('MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库')
|
|
14
16
|
.version('0.1.0')
|
|
15
|
-
.requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis)')
|
|
17
|
+
.requiredOption('--type <type>', '数据库类型 (mysql|postgres|redis|oracle|dm)')
|
|
16
18
|
.requiredOption('--host <host>', '数据库主机地址')
|
|
17
19
|
.requiredOption('--port <port>', '数据库端口', parseInt)
|
|
18
20
|
.option('--user <user>', '用户名')
|
|
@@ -22,8 +24,8 @@ program
|
|
|
22
24
|
.action(async (options) => {
|
|
23
25
|
try {
|
|
24
26
|
// 验证数据库类型
|
|
25
|
-
if (!['mysql', 'postgres', 'redis'].includes(options.type)) {
|
|
26
|
-
console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis');
|
|
27
|
+
if (!['mysql', 'postgres', 'redis', 'oracle', 'dm'].includes(options.type)) {
|
|
28
|
+
console.error('❌ 错误: 不支持的数据库类型。支持的类型: mysql, postgres, redis, oracle, dm');
|
|
27
29
|
process.exit(1);
|
|
28
30
|
}
|
|
29
31
|
// 构建配置
|
|
@@ -73,6 +75,24 @@ program
|
|
|
73
75
|
database: config.database,
|
|
74
76
|
});
|
|
75
77
|
break;
|
|
78
|
+
case 'oracle':
|
|
79
|
+
adapter = new OracleAdapter({
|
|
80
|
+
host: config.host,
|
|
81
|
+
port: config.port,
|
|
82
|
+
user: config.user,
|
|
83
|
+
password: config.password,
|
|
84
|
+
database: config.database,
|
|
85
|
+
});
|
|
86
|
+
break;
|
|
87
|
+
case 'dm':
|
|
88
|
+
adapter = new DMAdapter({
|
|
89
|
+
host: config.host,
|
|
90
|
+
port: config.port,
|
|
91
|
+
user: config.user,
|
|
92
|
+
password: config.password,
|
|
93
|
+
database: config.database,
|
|
94
|
+
});
|
|
95
|
+
break;
|
|
76
96
|
default:
|
|
77
97
|
throw new Error(`不支持的数据库类型: ${config.type}`);
|
|
78
98
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/adapter.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export interface QueryResult {
|
|
|
49
49
|
*/
|
|
50
50
|
export interface SchemaInfo {
|
|
51
51
|
/** 数据库类型 */
|
|
52
|
-
databaseType: 'mysql' | 'postgres' | 'redis';
|
|
52
|
+
databaseType: 'mysql' | 'postgres' | 'redis' | 'oracle' | 'dm';
|
|
53
53
|
/** 数据库名称 */
|
|
54
54
|
databaseName: string;
|
|
55
55
|
/** 表信息列表 */
|
|
@@ -102,7 +102,7 @@ export interface IndexInfo {
|
|
|
102
102
|
* 数据库连接配置
|
|
103
103
|
*/
|
|
104
104
|
export interface DbConfig {
|
|
105
|
-
type: 'mysql' | 'postgres' | 'redis';
|
|
105
|
+
type: 'mysql' | 'postgres' | 'redis' | 'oracle' | 'dm';
|
|
106
106
|
host: string;
|
|
107
107
|
port: number;
|
|
108
108
|
user?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,SAAS,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjC;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,eAAe;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY;IACZ,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;IAC/D,YAAY;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY;IACZ,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW;IACX,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,WAAW;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,SAAS;IACT,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY;IACZ,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU;IACV,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU;IACV,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAC;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "universal-db-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MCP 数据库万能连接器 - 让 Claude Desktop 直接连接你的数据库",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -21,6 +21,9 @@
|
|
|
21
21
|
"mysql",
|
|
22
22
|
"postgresql",
|
|
23
23
|
"redis",
|
|
24
|
+
"oracle",
|
|
25
|
+
"dameng",
|
|
26
|
+
"dm",
|
|
24
27
|
"数据库",
|
|
25
28
|
"AI"
|
|
26
29
|
],
|
|
@@ -43,17 +46,25 @@
|
|
|
43
46
|
"commander": "^12.1.0",
|
|
44
47
|
"ioredis": "^5.4.2",
|
|
45
48
|
"mysql2": "^3.11.5",
|
|
49
|
+
"oracledb": "^6.7.0",
|
|
46
50
|
"pg": "^8.13.1",
|
|
47
51
|
"zod": "^3.24.1"
|
|
48
52
|
},
|
|
49
53
|
"devDependencies": {
|
|
50
54
|
"@types/node": "^22.10.5",
|
|
55
|
+
"@types/oracledb": "^6.5.1",
|
|
51
56
|
"@types/pg": "^8.11.10",
|
|
52
57
|
"typescript": "^5.7.3"
|
|
53
58
|
},
|
|
59
|
+
"optionalDependencies": {
|
|
60
|
+
"dmdb": "^1.0.46190"
|
|
61
|
+
},
|
|
54
62
|
"engines": {
|
|
55
63
|
"node": ">=20.0.0"
|
|
56
64
|
},
|
|
65
|
+
"publishConfig": {
|
|
66
|
+
"access": "public"
|
|
67
|
+
},
|
|
57
68
|
"repository": {
|
|
58
69
|
"type": "git",
|
|
59
70
|
"url": "https://github.com/Anarkh-Lee/universal-db-mcp.git"
|