From a7cc65da0f967d2d17436d92f98dd016ad303ffb Mon Sep 17 00:00:00 2001 From: p
Date: Fri, 14 Aug 2026 17:44:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=BB=BA=E8=A1=A8=E8=84=9A=E6=9C=AC=20?= =?UTF-8?q?+=20build.sh=20=E9=9B=86=E6=88=90=E5=BB=BA=E8=A1=A8=E5=92=8C?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.sh | 16 +++++++++++ scripts/create_tables.py | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 scripts/create_tables.py diff --git a/build.sh b/build.sh index eb7278b..5b5c246 100644 --- a/build.sh +++ b/build.sh @@ -132,6 +132,22 @@ for d in sd_projects sd_iterations; do done +# 10.6 Create module tables (models -> DDL -> execute) +echo "=== Module table creation ===" +if [ -f "$cdir/scripts/create_tables.py" ]; then + "$cdir/py3/bin/python" "$cdir/scripts/create_tables.py" || echo " WARN: create_tables.py failed (DB not ready?)" +else + echo " WARN: scripts/create_tables.py not found" +fi + +# 10.7 Import module init data (appcodes dictionaries) +echo "=== Module init data import ===" +if [ -f "$cdir/scripts/import_init.py" ]; then + "$cdir/py3/bin/python" "$cdir/scripts/import_init.py" || echo " WARN: import_init.py failed (DB not ready?)" +else + echo " WARN: scripts/import_init.py not found" +fi + # 11. Import RBAC permissions from conf/rp.json (r:p 数据 -> permission + rolepermission) echo "=== RBAC permission import ===" if [ -f "$cdir/scripts/import_rp.py" ]; then diff --git a/scripts/create_tables.py b/scripts/create_tables.py new file mode 100644 index 0000000..d0abafe --- /dev/null +++ b/scripts/create_tables.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""建表脚本:从各模块 models/*.json 生成 DDL 并在 pipeline 库执行。 + +对每个模块,调用 json2ddl 生成 DDL,按分号分割后逐条执行(幂等:DDL 含 DROP TABLE IF EXISTS)。 + +用法: + py3/bin/python scripts/create_tables.py +""" +import sys, os, asyncio, subprocess + +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) +ROOT_DIR = os.path.dirname(SCRIPT_DIR) +sys.path.insert(0, os.path.join(ROOT_DIR, 'py3', 'lib', 'python3.10', 'site-packages')) +sys.path.insert(0, ROOT_DIR) + +from sqlor.dbpools import DBPools +from appPublic.jsonConfig import getConfig +from appPublic.folderUtils import ProgramPath +from ahserver.serverenv import ServerEnv +from ahserver.globalEnv import initEnv + +TABLE_MODULES = ['product_management', 'discount', 'pricing', 'unipay', 'smssend'] + + +def split_ddl(ddl): + """按分号分割 DDL,跳过注释行和空语句。""" + stmts = [] + for raw in ddl.split(';'): + lines = [l for l in raw.split('\n') if not l.strip().startswith('--')] + s = '\n'.join(lines).strip() + if s: + stmts.append(s) + return stmts + + +async def main(): + config = getConfig(ROOT_DIR, NS={'workdir': ROOT_DIR, 'ProgramPath': ProgramPath()}) + DBPools(config.databases) + initEnv() + env = ServerEnv() + env.get_module_dbname = lambda m: 'pipeline' if 'pipeline' in m else 'sage' + + json2ddl = os.path.join(ROOT_DIR, 'py3', 'bin', 'json2ddl') + async with DBPools().sqlorContext('pipeline') as sor: + for mod in TABLE_MODULES: + models_dir = os.path.join(ROOT_DIR, 'pkgs', mod, 'models') + if not os.path.isdir(models_dir): + print(f' skip {mod}: no models dir') + continue + r = subprocess.run([json2ddl, 'mysql', models_dir], capture_output=True, text=True) + if r.returncode != 0 or not r.stdout.strip(): + print(f' skip {mod}: json2ddl failed') + continue + n = 0 + for stmt in split_ddl(r.stdout): + await sor.execute(stmt, {}) + n += 1 + print(f' tables: {mod} created ({n} statements)') + + +if __name__ == '__main__': + asyncio.run(main())