@dazitech/cli 3.0.9 → 3.1.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/README.md +1 -1
- package/dist/clis/dazi-app.js +1 -1
- package/dist/clis/dazi-flow.js +1 -1
- package/dist/clis/dazi-onto.js +7 -2
- package/dist/clis/dazi.js +1 -1
- package/dist/docs/flow/flow-project-guide.md +1 -1
- package/dist/docs/guides/troubleshooting.md +3 -3
- package/dist/docs/index.json +3 -3
- package/dist/docs/onto/dazi_script_sdk_reference.md +246 -244
- package/dist/docs/onto/function-guide.md +123 -123
- package/dist/docs/onto//346/234/254/344/275/223/345/210/206/347/261/273/350/247/204/345/210/222/344/270/216SDK/346/211/251/345/261/225/346/226/271/346/241/210.md +24 -23
- package/dist/docs/onto//346/234/254/344/275/223/345/221/275/345/220/215/350/247/204/350/214/203_/347/211/251/347/220/206/350/241/250Cube/344/270/216/345/257/271/350/261/241.md +402 -402
- package/dist/docs/onto//346/234/254/344/275/223/345/274/200/345/217/221/344/274/230/345/214/226/346/200/273/347/273/223.md +242 -0
- package/dist/docs/onto//346/234/254/344/275/223/350/204/232/346/234/254/347/274/226/345/206/231/346/214/207/345/215/227.md +339 -311
- package/dist/docs/onto//346/234/254/344/275/223/350/247/204/345/210/222/346/214/207/345/215/227.md +304 -281
- package/dist/docs/onto//350/204/232/346/234/254/350/277/220/350/241/214/345/270/270/350/247/201/351/224/231/350/257/257/345/244/204/347/220/206.md +242 -0
- package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/344/272/247/345/223/201/351/224/200/345/224/256/346/234/254/344/275/223/350/247/204/345/210/222/346/226/271/346/241/210.md +32 -32
- package/dist/docs/onto//350/247/204/345/210/222/347/244/272/344/276/213_/345/210/251/346/266/246/345/210/206/346/236/220/346/234/254/344/275/223/346/226/271/346/241/210.md +34 -32
- package/dist/examples/index.json +1 -1
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_category_mount.py +85 -0
- package/dist/examples/onto//345/210/251/346/266/246/347/244/272/344/276/213/setup/profit_ontology_init.py +2 -65
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_category_mount.py +82 -0
- package/dist/examples/onto//351/224/200/345/224/256/347/244/272/344/276/213/setup/sales_ontology_init.py +2 -53
- package/dist/prompts/index.json +8 -1
- package/dist/prompts/onto/function-design.md +73 -73
- package/dist/prompts/onto/planning-design.md +104 -0
- package/dist/prompts/onto/script-publish-run.md +229 -208
- package/package.json +1 -1
- package/dist/docs/onto//350/204/232/346/234/254/350/277/220/350/241/214/347/272/240/351/224/231_/345/225/206/345/212/241/346/210/220/346/234/254/346/226/271/346/241/210/345/274/200/345/217/221/350/277/207/347/250/213.md +0 -213
|
@@ -1,311 +1,339 @@
|
|
|
1
|
-
# 本体脚本编写指南
|
|
2
|
-
|
|
3
|
-
**文档 ID**: `onto/script-authoring`
|
|
4
|
-
|
|
5
|
-
本文说明本体实现单元内 **Python 脚本的目录、类型、发布与运行**(原独立的「脚本开发与发布」已与本文合并)。
|
|
6
|
-
|
|
7
|
-
> 终端命令均在 **`dazi-work` 根目录**执行:`dazi ...`(见 [CLI 调用约定](../guides/cli-invocation.md))。
|
|
8
|
-
|
|
9
|
-
## 执行脚本前必读(强制)
|
|
10
|
-
|
|
11
|
-
在终端执行 **`dazi onto script publish` / `script run` / `function run` / `save-test-arguments`** 之前,**必须**阅读:
|
|
12
|
-
|
|
13
|
-
| 文档 | 说明 |
|
|
14
|
-
| ---- | ---- |
|
|
15
|
-
| **[
|
|
16
|
-
|
|
17
|
-
`dazi docs show onto/script-run-troubleshooting` · 智能体另见提示词 **`onto/script-publish-run`**。
|
|
18
|
-
|
|
19
|
-
## 环境
|
|
20
|
-
|
|
21
|
-
- 推荐 **Python 3.10+**
|
|
22
|
-
- 脚本目录:**`<工作区根>/项目/<业务名>/本体/ontos/<实现名>/setup/`** 与 **`functions/`**(新建本体实现时自动创建)
|
|
23
|
-
- 扩展默认脚本语言:`dazi.onto.defaultScriptLang` = `python`
|
|
24
|
-
- 平台 API:`dazi.serverUrl`;登录:`dazi auth login` / `dazi auth set-token`
|
|
25
|
-
|
|
26
|
-
## 目录约定
|
|
27
|
-
|
|
28
|
-
```text
|
|
29
|
-
<工作区根>/项目/<业务名>/ ← 业务项目根
|
|
30
|
-
└── 本体/
|
|
31
|
-
└── ontos/<实现名>/ ← 本体实现单元;README 含 space_id
|
|
32
|
-
├── README.md
|
|
33
|
-
├── 快速启动_<实现名>.md
|
|
34
|
-
├── plans/ ← 规划阶段 Markdown 产出
|
|
35
|
-
├── setup/ ← 初始化、灌数脚本
|
|
36
|
-
└── functions/ ← 本体函数、动作脚本
|
|
37
|
-
├── test_arguments/ ← 各 function_id 的 test_arguments JSON
|
|
38
|
-
├── save_test_arguments.ps1 ← 可选:批量写入平台(推荐)
|
|
39
|
-
└── *.py
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
| 示例包 | 目录 | 规划文档 | 主要内容 |
|
|
45
|
-
|--------|------|----------|----------|
|
|
46
|
-
| **销售示例**(推荐) | `onto/销售示例/` | [规划示例_产品销售本体规划方案](./规划示例_产品销售本体规划方案.md) | `setup/sales_ontology_init.py`、`sales_seed_data.py`、7 个 `sales_fn_*.py`、`test_arguments/` |
|
|
47
|
-
| **利润示例**(补充) | `onto/利润示例/` | [规划示例_利润分析本体方案](./规划示例_利润分析本体方案.md) | `setup/profit_ontology_init.py`、`profit_seed_data.py`、7 个 `profit_fn_*.py`、`test_arguments/` |
|
|
48
|
-
|
|
49
|
-
总览说明:`资源/examples/onto/README.md`(`dazi examples show onto/readme`)。
|
|
50
|
-
|
|
51
|
-
> **不再使用** 历史路径 `onto/<space_id>/editorial/`、`editorial/functions/`、`项目/onto_<名称>/脚本/` 等作为本地开发约定。
|
|
52
|
-
|
|
53
|
-
## 必读规范(DaziScript)
|
|
54
|
-
|
|
55
|
-
编写 `setup/`、`functions/` 下 `.py` 前请阅读:
|
|
56
|
-
|
|
57
|
-
| 文档 | 说明 |
|
|
58
|
-
| ------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
59
|
-
| **[DaziScript SDK 参考](./dazi_script_sdk_reference.md)** | `space` / `s.sql` / `s.onto` / `s.tables` / Cube 等 API 与本体落库顺序 |
|
|
60
|
-
| **[DaziScript 灌数脚本编写指南](./dazi_script_seed_data_guide.md)** | 造数、补数、`insert_rows` 与 ClickHouse `INSERT` 约束、幂等约定 |
|
|
61
|
-
|
|
62
|
-
同步到工作区:`dazi docs sync` → `资源/docs/onto/`。
|
|
63
|
-
|
|
64
|
-
## 初始化脚本标准顺序(setup)
|
|
65
|
-
|
|
66
|
-
`*_ontology_init.py` 建议按以下顺序执行(与 [本体规划指南](./本体规划指南.md) 物理层 + 表间关系章节一致):
|
|
67
|
-
|
|
68
|
-
| 步骤 | 内容 | API |
|
|
69
|
-
| ---- | ---- | --- |
|
|
70
|
-
| 1 | 建表 | `s.sql.execute(CREATE TABLE ...)` |
|
|
71
|
-
| 2 | 注册表 | `s.tables.register_with_meta`(含表/列 `display_name`、`description`) |
|
|
72
|
-
| 3 | **注册表间关系** | `s.tables.add_relationship(...)` |
|
|
73
|
-
| 4 | 注册 Cube / 派生度量 | `s.register_cube`、`s.upsert_derived_measures` |
|
|
74
|
-
| 5 | 本体对象 / 属性 / 链接 | `s.onto.define_*`、`s.sync_metric_refs` |
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
|
|
107
|
-
{"name": "
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
|
170
|
-
|
|
|
171
|
-
|
|
|
172
|
-
| `
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
dazi onto function
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
dazi onto
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
dazi onto
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
dazi onto
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
-
|
|
308
|
-
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
1
|
+
# 本体脚本编写指南
|
|
2
|
+
|
|
3
|
+
**文档 ID**: `onto/script-authoring`
|
|
4
|
+
|
|
5
|
+
本文说明本体实现单元内 **Python 脚本的目录、类型、发布与运行**(原独立的「脚本开发与发布」已与本文合并)。
|
|
6
|
+
|
|
7
|
+
> 终端命令均在 **`dazi-work` 根目录**执行:`dazi ...`(见 [CLI 调用约定](../guides/cli-invocation.md))。
|
|
8
|
+
|
|
9
|
+
## 执行脚本前必读(强制)
|
|
10
|
+
|
|
11
|
+
在终端执行 **`dazi onto script publish` / `script run` / `function run` / `save-test-arguments`** 之前,**必须**阅读:
|
|
12
|
+
|
|
13
|
+
| 文档 | 说明 |
|
|
14
|
+
| ---- | ---- |
|
|
15
|
+
| **[脚本运行常见错误处理](./脚本运行常见错误处理.md)** | setup API 误用、`query_one` 聚合陷阱、**函数禁止 `output.print_json()`**、CLI 参数(`function run` 不支持 JSON 文件、`save-test-arguments` 须 `ofn_xxx`) |
|
|
16
|
+
|
|
17
|
+
`dazi docs show onto/script-run-troubleshooting` · 智能体另见提示词 **`onto/script-publish-run`**。
|
|
18
|
+
|
|
19
|
+
## 环境
|
|
20
|
+
|
|
21
|
+
- 推荐 **Python 3.10+**
|
|
22
|
+
- 脚本目录:**`<工作区根>/项目/<业务名>/本体/ontos/<实现名>/setup/`** 与 **`functions/`**(新建本体实现时自动创建)
|
|
23
|
+
- 扩展默认脚本语言:`dazi.onto.defaultScriptLang` = `python`
|
|
24
|
+
- 平台 API:`dazi.serverUrl`;登录:`dazi auth login` / `dazi auth set-token`
|
|
25
|
+
|
|
26
|
+
## 目录约定
|
|
27
|
+
|
|
28
|
+
```text
|
|
29
|
+
<工作区根>/项目/<业务名>/ ← 业务项目根
|
|
30
|
+
└── 本体/
|
|
31
|
+
└── ontos/<实现名>/ ← 本体实现单元;README 含 space_id
|
|
32
|
+
├── README.md
|
|
33
|
+
├── 快速启动_<实现名>.md
|
|
34
|
+
├── plans/ ← 规划阶段 Markdown 产出
|
|
35
|
+
├── setup/ ← 初始化、灌数脚本
|
|
36
|
+
└── functions/ ← 本体函数、动作脚本
|
|
37
|
+
├── test_arguments/ ← 各 function_id 的 test_arguments JSON
|
|
38
|
+
├── save_test_arguments.ps1 ← 可选:批量写入平台(推荐)
|
|
39
|
+
└── *.py
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
内置示例位于 **`资源/examples/onto/`**(`dazi examples sync`)。**须 `plans/` 定稿后**再借鉴或复制 init/seed(见快速启动 §0、§3;规划任务用提示词 **`onto/planning-design`**)。
|
|
43
|
+
|
|
44
|
+
| 示例包 | 目录 | 规划文档 | 主要内容 |
|
|
45
|
+
|--------|------|----------|----------|
|
|
46
|
+
| **销售示例**(推荐) | `onto/销售示例/` | [规划示例_产品销售本体规划方案](./规划示例_产品销售本体规划方案.md) | `setup/sales_ontology_init.py`、`sales_seed_data.py`、7 个 `sales_fn_*.py`、`test_arguments/` |
|
|
47
|
+
| **利润示例**(补充) | `onto/利润示例/` | [规划示例_利润分析本体方案](./规划示例_利润分析本体方案.md) | `setup/profit_ontology_init.py`、`profit_seed_data.py`、7 个 `profit_fn_*.py`、`test_arguments/` |
|
|
48
|
+
|
|
49
|
+
总览说明:`资源/examples/onto/README.md`(`dazi examples show onto/readme`)。
|
|
50
|
+
|
|
51
|
+
> **不再使用** 历史路径 `onto/<space_id>/editorial/`、`editorial/functions/`、`项目/onto_<名称>/脚本/` 等作为本地开发约定。
|
|
52
|
+
|
|
53
|
+
## 必读规范(DaziScript)
|
|
54
|
+
|
|
55
|
+
编写 `setup/`、`functions/` 下 `.py` 前请阅读:
|
|
56
|
+
|
|
57
|
+
| 文档 | 说明 |
|
|
58
|
+
| ------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
59
|
+
| **[DaziScript SDK 参考](./dazi_script_sdk_reference.md)** | `space` / `s.sql` / `s.onto` / `s.tables` / Cube 等 API 与本体落库顺序 |
|
|
60
|
+
| **[DaziScript 灌数脚本编写指南](./dazi_script_seed_data_guide.md)** | 造数、补数、`insert_rows` 与 ClickHouse `INSERT` 约束、幂等约定 |
|
|
61
|
+
|
|
62
|
+
同步到工作区:`dazi docs sync` → `资源/docs/onto/`。
|
|
63
|
+
|
|
64
|
+
## 初始化脚本标准顺序(setup)
|
|
65
|
+
|
|
66
|
+
`*_ontology_init.py` 建议按以下顺序执行(与 [本体规划指南](./本体规划指南.md) 物理层 + 表间关系章节一致):
|
|
67
|
+
|
|
68
|
+
| 步骤 | 内容 | API |
|
|
69
|
+
| ---- | ---- | --- |
|
|
70
|
+
| 1 | 建表 | `s.sql.execute(CREATE TABLE ...)` |
|
|
71
|
+
| 2 | 注册表 | `s.tables.register_with_meta`(含表/列 `display_name`、`description`) |
|
|
72
|
+
| 3 | **注册表间关系** | `s.tables.add_relationship(...)` |
|
|
73
|
+
| 4 | 注册 Cube / 派生度量 | `s.register_cube`、`s.upsert_derived_measures` |
|
|
74
|
+
| 5 | 本体对象 / 属性 / 链接 | `s.onto.define_*`、`s.sync_metric_refs` |
|
|
75
|
+
|
|
76
|
+
**平台分类挂载**不在 init 内执行,见下方「分类挂载脚本」与实施顺序。
|
|
77
|
+
|
|
78
|
+
### 表间关系 `s.tables.add_relationship`
|
|
79
|
+
|
|
80
|
+
在 **表 register 完成之后、Cube 注册之前** 调用;**幂等**,可重复执行 init。
|
|
81
|
+
|
|
82
|
+
```python
|
|
83
|
+
s.tables.add_relationship(
|
|
84
|
+
from_table="sales_order_fact", # 通常为事实表
|
|
85
|
+
to_table="product_master", # 维表
|
|
86
|
+
join_sql="sales_order_fact.product_id = product_master.product_id",
|
|
87
|
+
join_keys=[{"from": "product_id", "to": "product_id"}],
|
|
88
|
+
relationship_type="many_to_one", # 默认 many_to_one
|
|
89
|
+
description="销售订单行关联产品主数据",
|
|
90
|
+
)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
验收:`dazi onto space get <space-id>` 中 **`relationship_count`** 与规划条数一致;侧栏 **数据资源 → 表间关系** 可见。
|
|
94
|
+
|
|
95
|
+
> **勿与** `s.onto.define_link_type` 混淆:前者写数据空间元数据,后者写业务对象语义链接,**两者都需实施**。
|
|
96
|
+
|
|
97
|
+
### 表注册 `TABLE_REGISTRY` + `register_with_meta`
|
|
98
|
+
|
|
99
|
+
init 脚本顶部维护与规划文档对齐的 `TABLE_REGISTRY`(项目内 `plans/*.md` 或内置 [规划示例](./规划示例_产品销售本体规划方案.md)),步骤 2 统一调用:
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
TABLE_REGISTRY = {
|
|
103
|
+
"fact_sales_order_line": {
|
|
104
|
+
"display_name": "销售订单行事实表",
|
|
105
|
+
"description": "订单行粒度销售流水",
|
|
106
|
+
"columns": [
|
|
107
|
+
{"name": "order_id", "display_name": "订单 ID"},
|
|
108
|
+
{"name": "date_key", "display_name": "日期键", "description": "关联 dim_date"},
|
|
109
|
+
# ...
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
for tbl_name, meta in TABLE_REGISTRY.items():
|
|
115
|
+
s.tables.register_with_meta(
|
|
116
|
+
table_name=tbl_name,
|
|
117
|
+
display_name=meta["display_name"],
|
|
118
|
+
description=meta.get("description"),
|
|
119
|
+
columns=meta["columns"],
|
|
120
|
+
force_column_meta=True, # 规划变更后重跑 init 时刷新列元数据
|
|
121
|
+
)
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- **显示名** → 侧栏与表预览列标题(`display_name`)
|
|
125
|
+
- **说明** → 业务口径、FK、冗余原因(`description`);`sync_columns` **不会**自动写入
|
|
126
|
+
- 参考:`资源/examples/onto/利润示例/setup/profit_ontology_init.py`、`销售示例/setup/sales_ontology_init.py`
|
|
127
|
+
|
|
128
|
+
### 分类挂载脚本 `*_category_mount.py`(推荐,类灌数)
|
|
129
|
+
|
|
130
|
+
与 `*_seed_data.py` 一样,**独立 setup 脚本、放在实施流程最后**,避免 init 与函数 publish 的先后顺序问题。
|
|
131
|
+
|
|
132
|
+
| 脚本 | 时机 |
|
|
133
|
+
| ---- | ---- |
|
|
134
|
+
| `*_ontology_init.py` | 建表、注册、Cube、对象、链接(**不含**分类挂载) |
|
|
135
|
+
| `*_seed_data.py` | 灌数 |
|
|
136
|
+
| `functions/*.py` | 逐个 `publish --register-function-id` |
|
|
137
|
+
| **`*_category_mount.py`** | **最后**:一次性 `apply_registry` 全量 `CATEGORY_REGISTRY` |
|
|
138
|
+
|
|
139
|
+
**标准实施顺序**:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
init → seed → 发布全部函数 → category_mount
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
`setup/*_category_mount.py` 顶部维护与规划附录 B 对齐的 `CATEGORY_REGISTRY`(含 table/cube/object/relation/link/**function** 六类):
|
|
146
|
+
|
|
147
|
+
```python
|
|
148
|
+
CATEGORY_REGISTRY = {
|
|
149
|
+
"table": {"维度表": ["dim_account"], "事实表": ["fact_x"]},
|
|
150
|
+
"cube": {"流程型": ["ActualCube"]},
|
|
151
|
+
"object": {"主数据": ["Account"]},
|
|
152
|
+
"relation": {"时间关联": [("fact_x", "dim_date")]},
|
|
153
|
+
"link": {"归属关系": ["entry_belongs_account"]},
|
|
154
|
+
"function": {"总览分析": ["domain.fn.get_summary"]},
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
s.categories.apply_registry(CATEGORY_REGISTRY, skip_missing=True)
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- `skip_missing=True`:函数未 publish 时跳过并 warning;**全部函数就绪后重跑本脚本即可**,无需重跑 init
|
|
161
|
+
- 可选补充:单函数 publish 时 `--register-platform-category`(与 category_mount 幂等可并存)
|
|
162
|
+
- 示例:`利润示例/setup/profit_category_mount.py`、`销售示例/setup/sales_category_mount.py`
|
|
163
|
+
- 详见 [本体分类规划与SDK扩展方案](./本体分类规划与SDK扩展方案.md)、[脚本运行常见错误处理](./脚本运行常见错误处理.md) §6
|
|
164
|
+
|
|
165
|
+
## 脚本类型
|
|
166
|
+
|
|
167
|
+
类型由 **发布命令参数** 区分;初始化与灌数放 `setup/`,本体函数与动作放 `functions/`:
|
|
168
|
+
|
|
169
|
+
| 类型 | 路径约定 | 说明 |
|
|
170
|
+
| ------------------- | ----------------------------------------------------------------- | -------------------------------------------------- |
|
|
171
|
+
| `ontology_function` | `项目/<业务名>/本体/ontos/<实现名>/functions/**/*.py` | **必须**带 `--register-function-id` 发布(见下节) |
|
|
172
|
+
| `ontology_action` | `项目/<业务名>/本体/ontos/<实现名>/functions/**/*.py` | 发布时加 `--register-action-id` 等 Action 参数 |
|
|
173
|
+
| `data_script` | `项目/<业务名>/本体/ontos/<实现名>/setup/**/*.py` | 普通 `script publish`,不注册函数/动作 |
|
|
174
|
+
|
|
175
|
+
`<space-id>` 从 **`项目/<业务名>/本体/ontos/<实现名>/README.md`** 读取,勿手写错空间。
|
|
176
|
+
|
|
177
|
+
## 发布预检
|
|
178
|
+
|
|
179
|
+
```powershell
|
|
180
|
+
dazi onto script publish-preview 项目/<业务名>/本体/ontos/<实现名>/functions/my_func.py --space <space-id>
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## 发布脚本
|
|
184
|
+
|
|
185
|
+
> **勿用** 独立命令 `dazi-onto`(v3 未安装到 PATH)。统一使用 **`dazi onto ...`**。
|
|
186
|
+
|
|
187
|
+
### 本体函数:**必须注册**,否则侧栏与测试看不到
|
|
188
|
+
|
|
189
|
+
`functions/`(或规划中的本体函数 `.py`)**不能**只执行「普通 publish」:
|
|
190
|
+
|
|
191
|
+
**新建函数**:复制 `资源/examples/onto/_templates/ontology_function_template.py`(`dazi examples show onto/template/ontology-function`),或参考 `销售示例/functions/sales_fn_get_summary.py`。`main()` **无参**,业务写在 `_ontology_fn_body(p)`,末尾 **`return _ontology_fn_body(p)`** — **禁止** `output.print_json()`(见 [脚本运行常见错误处理 §3](./脚本运行常见错误处理.md#3-函数输出禁止-outputprint_json))。
|
|
192
|
+
|
|
193
|
+
| 仅 `script publish`(无 `--register-function-id`) | 带 `--register-function-id` 发布 |
|
|
194
|
+
| -------------------------------------------------- | -------------------------------------------- |
|
|
195
|
+
| 脚本代码进入 `ads_scripts` | 同上 **且** 写入 `ontology_function_defs` |
|
|
196
|
+
| **不会**出现在 **Onto → 函数列表** | 出现在函数列表,可 **运行函数** / 工作台测试 |
|
|
197
|
+
| `dazi onto function run <id>` **找不到** | `function run`、侧栏运行可用 |
|
|
198
|
+
|
|
199
|
+
因此:**首次发布本体函数时,命令里必须包含 `--register-function-id`**,且 `function_id` 与规划文档、脚本内约定 **完全一致**(建议带点号命名空间,如 `sales.fn.get_summary`,勿随意简写为 `get_summary`)。
|
|
200
|
+
|
|
201
|
+
智能体(TRAE 等)实施自检:
|
|
202
|
+
|
|
203
|
+
1. 发布命令是否包含 `--register-function-id`?
|
|
204
|
+
2. 发布输出是否含 `functionId: xxx` / `function_registration.ok`?
|
|
205
|
+
3. `dazi onto function list --space <space-id>` 能否看到该 `function_id`?
|
|
206
|
+
4. 规划函数数 = `functions/*.py` 文件数 = `function list` 条数?
|
|
207
|
+
5. 平台分类:已 run `*_category_mount.py`(或各 publish 已带 `--register-platform-category`)?
|
|
208
|
+
|
|
209
|
+
任一步不满足 → **视为未注册或未分类**,需补 publish / 补跑 `category_mount`,不要仅 `script run` 以为函数已可用。
|
|
210
|
+
|
|
211
|
+
```powershell
|
|
212
|
+
# 初始化 / 灌数:普通发布即可(不要加 register-function-id)
|
|
213
|
+
dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/setup/xxx_ontology_init.py --space <space-id> --type setup
|
|
214
|
+
dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/setup/xxx_seed_data.py --space <space-id> --type data
|
|
215
|
+
|
|
216
|
+
# ★ 本体函数:必须注册(示例);可选同时挂载 平台分类
|
|
217
|
+
dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/functions/get_summary.py `
|
|
218
|
+
--space <space-id> `
|
|
219
|
+
--register-function-id sales.fn.get_summary `
|
|
220
|
+
--register-platform-category 总览分析
|
|
221
|
+
|
|
222
|
+
# 发布并注册为本体动作(示例)
|
|
223
|
+
dazi onto script publish 项目/<业务名>/本体/ontos/<实现名>/functions/my_action.py `
|
|
224
|
+
--space <space-id> `
|
|
225
|
+
--register-action-id my_action_code `
|
|
226
|
+
--register-action-permission-tag "finance.write"
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
发布后验证:
|
|
230
|
+
|
|
231
|
+
```powershell
|
|
232
|
+
dazi onto function list --space <space-id>
|
|
233
|
+
dazi onto function run sales.fn.get_summary --space <space-id> --params '{}'
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 函数测试参数(test_arguments,**发布后必做**)
|
|
237
|
+
|
|
238
|
+
仅 `publish` + `function run` **不会**自动写入测试参数;侧栏 **Onto → 运行函数** 依赖函数定义上的 **`test_arguments`** 预填表单。
|
|
239
|
+
|
|
240
|
+
> **CLI 易错点**:`function run` **不支持** `--arguments-json-file`;`save-test-arguments` 须用 **`ofn_xxx` 内部 id** 而非 `function_id` 字符串。完整说明见 [脚本运行常见错误处理](./脚本运行常见错误处理.md)。
|
|
241
|
+
|
|
242
|
+
**本地约定(与规划文档 § 函数 / test_arguments 一致)**:
|
|
243
|
+
|
|
244
|
+
1. 每个函数一份 JSON:`functions/test_arguments/<function_id>.json`
|
|
245
|
+
2. 脚本内同名常量 `TEST_ARGUMENTS`(与 JSON **保持同步**)
|
|
246
|
+
3. 函数 `main()` 通过 `ctx.params` 读取的键名 = JSON 内 **`arguments`** 对象的键名
|
|
247
|
+
|
|
248
|
+
**JSON 格式**(与平台函数定义一致):
|
|
249
|
+
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"v": 1,
|
|
253
|
+
"arguments": {
|
|
254
|
+
"start_date": "2025-01-01",
|
|
255
|
+
"end_date": "2026-06-30"
|
|
256
|
+
},
|
|
257
|
+
"object_type_code": "SalesAnalysis"
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**保存到平台**(函数 `run` 验证通过后):
|
|
262
|
+
|
|
263
|
+
```powershell
|
|
264
|
+
# 推荐:批量脚本(解析 function list,用内部 id ofn_xxx 调用 PATCH)
|
|
265
|
+
.\项目/<业务名>/本体/ontos/<实现名>/functions/save_test_arguments.ps1
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
单条保存(**须用平台内部 id `ofn_xxx`**,先 `dazi onto function list --space <space-id>` 查看;直接传 `sales.fn.xxx` 可能 **404**):
|
|
269
|
+
|
|
270
|
+
```powershell
|
|
271
|
+
dazi onto function save-test-arguments ofn_156a399fbe0e4636 --space <space-id> `
|
|
272
|
+
--arguments-json-file 项目/<业务名>/本体/ontos/<实现名>/functions/test_arguments/sales.fn.get_summary.json
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**PowerShell 传 `--params` 易丢引号**;测试运行可省略 `--params`(用 `{}`),或:
|
|
276
|
+
|
|
277
|
+
```powershell
|
|
278
|
+
$env:DAZI_PARAMS='{"start_date":"2025-01-01","end_date":"2026-06-30"}'
|
|
279
|
+
dazi onto function run sales.fn.get_summary --space <space-id> --params $env:DAZI_PARAMS
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
验收:`dazi onto function get <function_id> --space <space-id>` 中 **`test_arguments` 非 null**,且 `arguments` 与 JSON 一致。
|
|
283
|
+
|
|
284
|
+
亦可在 VS Code 侧栏 **Onto 本体 → 发布函数** 发布(须填写/绑定 **function_id**);发布后在 **函数** 节点下应能看到该函数。
|
|
285
|
+
|
|
286
|
+
函数生命周期与 `update-code` 详见 **[本体函数开发指南](./function-guide.md)**。给 TRAE 的完整命令模板见内置提示词 **`onto/script-publish-run`**(`dazi prompt sync` 后位于 `资源/prompts/onto/`)。
|
|
287
|
+
|
|
288
|
+
## 从平台拉取脚本(可选)
|
|
289
|
+
|
|
290
|
+
若需将平台上已有脚本拉回本地对照(**非**日常开发主路径):
|
|
291
|
+
|
|
292
|
+
```powershell
|
|
293
|
+
# 推荐:落盘到本体实现目录(按 setup / functions 分子目录)
|
|
294
|
+
dazi onto script sync --space <space-id> --target-dir 项目/<业务名>/本体/ontos/<实现名>
|
|
295
|
+
dazi onto script sync --space <space-id> --type ontology_function --target-dir 项目/<业务名>/本体/ontos/<实现名>
|
|
296
|
+
dazi onto script sync --space <space-id> --dry-run --target-dir 项目/<业务名>/本体/ontos/<实现名>
|
|
297
|
+
|
|
298
|
+
# legacy:onto/<space-id>/scripts/(非日常开发入口)
|
|
299
|
+
dazi onto script sync --space <space-id>
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
拉取目标目录以 CLI 为准;**新建与修改仍以 `项目/<业务名>/本体/ontos/<实现名>/setup/` 与 `functions/` 为准**。
|
|
303
|
+
|
|
304
|
+
## 清理重复脚本
|
|
305
|
+
|
|
306
|
+
```powershell
|
|
307
|
+
dazi onto script dedupe --space <space-id> --dry-run
|
|
308
|
+
dazi onto script dedupe --space <space-id> --yes
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## 编写建议
|
|
312
|
+
|
|
313
|
+
1. 先阅读 `快速启动_<实现名>.md` 与 `README.md` 中的**数据空间 ID**,并对照 `plans/` 中**表间关系**与**函数 test_arguments** 章节
|
|
314
|
+
2. 在 `setup/`、`functions/` 中按模块拆分 `.py`(初始化、灌数、本体函数可分机文件)
|
|
315
|
+
3. **init 脚本**必须包含 `s.tables.add_relationship`(若规划有表间关系)
|
|
316
|
+
4. 发布与运行:`dazi onto script publish`(**函数必须** `--register-function-id`)→ `function run` 验证 → **`save-test-arguments`**
|
|
317
|
+
5. 本地仅调试 Python 语法时可在 VS Code 中直接运行 `.py`(**不会**自动连平台;连平台须发布后在侧栏或 CLI 执行)
|
|
318
|
+
|
|
319
|
+
## 实施自检(智能体 / 人工)
|
|
320
|
+
|
|
321
|
+
| 检查项 | 命令 / 位置 |
|
|
322
|
+
| ------ | ----------- |
|
|
323
|
+
| 表已注册 | 侧栏 **数据资源** 或 `dazi onto space get` → `table_count` |
|
|
324
|
+
| **表间关系已注册** | `relationship_count` > 0;侧栏 **表间关系** |
|
|
325
|
+
| **平台分类已挂载** | 侧栏分类视图下表/Cube/对象/函数按标准中文名分组;`category_mount` 摘要含 `category_mounts` |
|
|
326
|
+
| 函数已注册 | `dazi onto function list --space <space-id>` |
|
|
327
|
+
| **test_arguments 已保存** | `dazi onto function get <function_id>` → `test_arguments.arguments` |
|
|
328
|
+
| 函数可运行 | `dazi onto function run <function_id> --space <space-id> --params '{}'` |
|
|
329
|
+
|
|
330
|
+
## 相关文档
|
|
331
|
+
|
|
332
|
+
- [CLI 调用约定](../guides/cli-invocation.md)
|
|
333
|
+
- [本体规划指南](./本体规划指南.md)
|
|
334
|
+
- [本体函数开发指南](./function-guide.md)
|
|
335
|
+
- [本体动作开发](./action-guide.md)
|
|
336
|
+
- [规划示例:产品销售本体(推荐)](./规划示例_产品销售本体规划方案.md)
|
|
337
|
+
- [规划示例:利润分析本体(补充)](./规划示例_利润分析本体方案.md)
|
|
338
|
+
- [本体分类规划与 SDK 扩展方案](./本体分类规划与SDK扩展方案.md)
|
|
339
|
+
- [脚本运行常见错误处理](./脚本运行常见错误处理.md)
|