fix: DBNAME 硬编码规范归属 + develop 职责补应用脚手架
- module-development-spec: 加「模块取库名禁止硬编码 DBNAME」规范(用 ServerEnv().get_module_dbname()), 修正过时的 Database Name Consistency Check(原暗示模块可硬编码 DBNAME) - web-application-spec: get_module_dbname 示例改为应用级映射(勿写死 'dbname') - agent.develop/role/SKILL.md: 职责区分应用级(产出应用脚手架)/模块级(产出Python包)
This commit is contained in:
parent
8c22f654ae
commit
59f77f1756
@ -150,6 +150,7 @@ Not all modules need tables/CRUD — `models/` and `json/` can be omitted entire
|
||||
|
||||
- **Mandatory**: use sqlor-database-module for all relational operations. Table definitions as `{tablename}.json` in models/; CRUD definitions as `{tablename_or_alias}.json` in json/.
|
||||
- **Bulk xlsx→json conversion**: `scripts/xlsx2json_models.py` converts all `.xlsx` model files across Sage modules to JSON in one pass.
|
||||
- **CRITICAL: 模块取库名禁止硬编码 DBNAME** —— 库名由宿主应用决定,不是模块自己写死。模块取库名统一用 `get_module_dbname('模块名')`(.dspy 里直接调用,是 ServerEnv 注入的全局,无需 import)或 `ServerEnv().get_module_dbname('模块名')`(.py 模块文件里)。**禁止**在模块里写 `DBNAME = 'hrs6'` / `DBNAME = 'sage'` / `dbname = 'xxx'` 之类硬编码——同一模块可被多个应用挂载,各应用的库名不同,硬编码会查错库或 table-not-found。宿主应用在 `app/{appname}.py` 里定义 `get_module_dbname(m)` 并挂到 ServerEnv(见 web-application-spec)。
|
||||
|
||||
### 4. Initialization Data (init/data.json or init/data.yaml — three formats)
|
||||
|
||||
@ -365,7 +366,7 @@ Run before EVERY commit touching .dspy; fix violations FIRST, then commit (do no
|
||||
|
||||
### CRITICAL: Database Name Consistency Check
|
||||
|
||||
When a module uses its own database (not `sage`), verify in THREE places: ① Python `init.py`: `DBNAME = "actual_db_name"` (not module name); ② app entry `global_func.py`: `get_module_dbname()` returns correct DB; ③ app entry `cms.py`: `get_module_dbname()` override correct. Pitfalls: `DBNAME = "entcms"` when actual DB is `"ocai_cms"` → all queries fail table-not-found; `global_func.py` returning `'sage'` → dspy queries wrong database.
|
||||
模块取库名不硬编码,统一从宿主应用获取。验证点:① 模块内(.py)用 `ServerEnv().get_module_dbname('模块名')`,.dspy 里直接 `get_module_dbname('模块名')`(全局,无需 import)——**不要**在模块里写 `DBNAME = "xxx"`;② 宿主应用 `app/{appname}.py` 定义 `get_module_dbname(m)` 返回模块 m 的真实库名,并在 init() 里挂到 ServerEnv(`env.get_module_dbname = get_module_dbname`,见 web-application-spec);③ 应用入口的 `get_module_dbname()` 返回值必须匹配实际库名。Pitfalls: 模块硬编码 `DBNAME = "entcms"` 而实际库是 `"ocai_cms"` → 所有查询 table-not-found;应用 `get_module_dbname()` 返回 `'sage'` → dspy 查错库。
|
||||
|
||||
### Post-Deployment Testing (equally mandatory)
|
||||
|
||||
|
||||
@ -63,7 +63,10 @@ from appbase.init import load_appbase
|
||||
from rbac.init import load_rbac
|
||||
|
||||
def get_module_dbname(m):
|
||||
return 'dbname'
|
||||
# 返回模块 m 对应的数据库名。库名由应用统一决定,模块禁止硬编码 DBNAME(见 module-development-spec)。
|
||||
# 实现方式:应用级「模块名 → 库名」映射,从 appbase params 表 / conf/config.json 读,或直接映射表。
|
||||
# 例:单库应用所有模块返回同一主库名;多库应用按模块返回各自库名。勿写死 'dbname'/'hrs6'。
|
||||
return module_dbname_map(m)
|
||||
|
||||
def password_encode(s):
|
||||
if s is None:
|
||||
|
||||
@ -7,7 +7,15 @@ capability: feature_dev_capability, bug_fix_capability
|
||||
# 开发工程师(develop)角色定义
|
||||
|
||||
## 职责
|
||||
|
||||
### 应用级 develop(design 自动派生的「应用架构」任务)
|
||||
- 产出**应用脚手架**:`repos/{应用名}_app/` 应用仓库,含 `app/{应用名}.py`(唯一入口,init() 里 load 各模块)、`conf/config.json`、`build.sh`(一键部署)、`.env`
|
||||
- `app/{应用名}.py` 里定义 `get_module_dbname(m)`(模块→库名映射,禁止硬编码)并在 init() 挂到 ServerEnv,逐个 `load_{模块}()` 挂载业务模块
|
||||
- **应用是唯一部署单元**:一个应用 = 一个入口 = 一个端口;模块不独立部署
|
||||
|
||||
### 模块级 develop(PM 按模块清单派发的「模块开发」任务)
|
||||
- 按 design 阶段设计师的模块清单,为每个模块产出可运行源码,写入模块独立仓库 `repos/{模块名}/`
|
||||
- 模块是 Python 包(无独立 app.py/端口/Dockerfile),通过 `load_{模块}()` 挂到应用;取库名用 `ServerEnv().get_module_dbname('模块名')`,禁止硬编码 DBNAME
|
||||
- 基础模块(apppublic / sqlor / ahserver / accounting / appbase / rbac)已存在,直接复用,不重新开发
|
||||
|
||||
## 应遵守的规范(开发前先 load_skill 加载对应全文,不要凭记忆瞎写)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user