#!/usr/bin/env python3 """ 在达梦数据库机器上运行,查看各表结构,用于编写 config 中的 db.query 用法: python scripts/inspect_dm_tables.py 密码获取顺序:环境变量 DM_PASSWORD > 下方 LOCAL_PASSWORD 若使用 LOCAL_PASSWORD,切勿提交到 git!可执行:git update-index --assume-unchanged scripts/inspect_dm_tables.py """ import os import sys # 可选:在此直接填写密码(仅限本机调试,切勿提交到版本库!) LOCAL_PASSWORD = None # 例如: "你的密码" # 支持从项目根或 scripts 目录运行 _script_dir = os.path.dirname(os.path.abspath(__file__)) _project_root = os.path.dirname(_script_dir) if _project_root not in sys.path: sys.path.insert(0, _project_root) try: import dmPython except ImportError: print("请先安装: pip install dmPython") sys.exit(1) CONFIG = { "user": "SYSDBA", "password": os.environ.get("DM_PASSWORD") or LOCAL_PASSWORD, "server": "127.0.0.1", "port": 5080, "schema": "SYSDBA", } TABLES = [ "OBJECTIVE_INSTANCE", "METRIC_VALUE_INSTANCE", "METRIC_PROFILE", "ROLE_PROFILE", "TASK_PROFILE", "RELATION_INSTANCE", ] def main(): if not CONFIG["password"]: print("请设置环境变量 DM_PASSWORD 或在脚本中填写 LOCAL_PASSWORD") sys.exit(1) try: conn = dmPython.connect( user=CONFIG["user"], password=CONFIG["password"], server=CONFIG["server"], port=CONFIG["port"], schema=CONFIG["schema"], ) except Exception as e: print(f"连接失败: {e}") sys.exit(1) cursor = conn.cursor() print("=" * 60) print("达梦表结构(用于编写 config/db.query)") print("=" * 60) for table in TABLES: try: cursor.execute(f'SELECT * FROM "{CONFIG["schema"]}"."{table}" WHERE 1=0') cols = [d[0] for d in cursor.description] print(f"\n【{table}】 列: {cols}") except Exception as e: print(f"\n【{table}】 查询失败: {e}") cursor.execute( """ SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE FROM DBA_TAB_COLUMNS WHERE OWNER = ? ORDER BY TABLE_NAME, COLUMN_ID """, (CONFIG["schema"],), ) rows = cursor.fetchall() print("\n" + "=" * 60) print("所有列详情 (TABLE_NAME | COLUMN_NAME | DATA_TYPE)") print("=" * 60) cur_table = None for table, col, dtype in rows: if table != cur_table: cur_table = table print(f"\n--- {table} ---") print(f" {col}: {dtype}") cursor.close() conn.close() print("\n完成。请根据上述结构在 config 中编写 db.query。") if __name__ == "__main__": main()