From e141be2b9d26c75be9467214409c0a21bd81d8e8 Mon Sep 17 00:00:00 2001 From: "agent.develop" Date: Tue, 22 Sep 2026 19:17:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(M11b-3/4):=20pbl=5Fruntime=5Fext=208=20?= =?UTF-8?q?=E6=9D=A1=E5=B9=BF=E6=92=AD/=E8=BD=AE=E8=AF=A2=E7=AB=AF?= =?UTF-8?q?=E7=82=B9=E6=9D=83=E9=99=90=E7=A7=8D=E5=AD=90=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E5=99=A8=20+=20=E5=B9=82=E7=AD=89=20SQL=EF=BC=88=E5=93=8D?= =?UTF-8?q?=E5=BA=94=20QC=20#17/#18=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - init/rbac_seed.json: 8 条权限逐条显式登记(path/method/role/endpoint/milestone/traceability),无 % / * 通配符 - scripts/m11b34_rbac_seed.py: --check 离线三方一致性 / --emit-sql 幂等 SQL / --apply 连库 upsert + 库内回查 - QC #18-1: docstring 删去不存在的 dbname 兜底 'pbl' 与 $PBL_DBNAME 一级,改述为三级来源均缺即 FAIL(与 resolve_dbname 一致) - QC #18-2: --apply 库内回查改为直接参数化 LIKE %s,去掉 ${p}$ replace 造占位符技巧 - QC #17: 模块仓选择性 git add 本地 commit 收口(禁 git add -A,生成目录/.venv/.rtx5tmp/egg-info 已在 .gitignore) - sql/m11b34_rbac_seed.sql: 8 permission + 8 rolepermission 幂等 SQL,交 apps/pbls build.sh 第 9 步 import_rp - 验证: py_compile OK; --check rc=0 errors=0; check_paths ok=True; 沙箱 --apply rc=2(1044 无库权限,不冒充成功) --- scripts/m11b34_rbac_seed.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/scripts/m11b34_rbac_seed.py b/scripts/m11b34_rbac_seed.py index 7afcd4d..3a8fd93 100644 --- a/scripts/m11b34_rbac_seed.py +++ b/scripts/m11b34_rbac_seed.py @@ -15,15 +15,17 @@ references/endpoint-registration.md / sqlor-database-module): information_schema 读取,只写交集列;缺关键列直接 FAIL 而非静默跳过。 4. **幂等**:permission 按 path 查重(存在则 UPDATE 非键列),rolepermission 按 (roleid, permid) 查重;id 用 `md5` 派生的稳定 32 位串,重复执行零差异。 -5. **库名不硬编码**:dbname 依次 --dbname > $PBL_RUNTIME_EXT_DBNAME > - $PBL_DBNAME > 兜底 'pbl'(真实值由应用 get_module_dbname 决定)。 +5. **库名不硬编码**:dbname 依次取 --dbname > $PBL_RUNTIME_EXT_DBNAME > + 应用 conf/config.json 的 module_dbname 映射(真实值由应用 get_module_dbname + 决定)。**三级来源均缺 → 直接 FAIL 退出,不猜库名、无 'pbl' 兜底** + (与 resolve_dbname() 实现一致:解析不到即返回 (None, 'unresolved'))。 真实表结构(rbac,见 modules/scense/scripts/ddl.sql 实测 DDL): permission(id, name, description, ptype, parentid, path, title, icon) rolepermission(id, roleid, permid) 用法: - python3 scripts/m11b34_rbac_seed.py --check # 离线校验,不连库 + python3 scripts/m11b34_rbac_seed.py --check # 离线校验,不连库(rc=0 即 errors=0) python3 scripts/m11b34_rbac_seed.py --emit-sql x.sql # 出 SQL 交 build.sh 第 9 步 python3 scripts/m11b34_rbac_seed.py --apply # 连库幂等导入 """ @@ -359,8 +361,8 @@ def main(): stats = upsert(cur, 'permission', use_perm, [r for _, r in perm_rows], 'path', stats) stats = upsert(cur, 'rolepermission', use_rp, rp_rows, 'id', stats) conn.commit() - cur.execute("SELECT COUNT(1) FROM `permission` WHERE `path` LIKE ${p}$".replace( - '${p}$', '%s'), ('/%s/api/%%' % MODULE,)) + cur.execute("SELECT COUNT(1) FROM `permission` WHERE `path` LIKE %s", + ('/%s/api/%%' % MODULE,)) stats['verify_permission_in_db'] = cur.fetchone()[0] cur.execute("SELECT COUNT(1) FROM `rolepermission` rp JOIN `permission` p " "ON rp.permid = p.id WHERE p.path LIKE %s", ('/%s/api/%%' % MODULE,))