"""初始化 jinrong_agent 库:依次执行 01-共用底座 + 02-agent专用 两份 DDL。 用法(密码与 core/reset.ps1 同一套,二选一): # 方式一:环境变量(避免命令行明文) $env:MYSQL_PWD = "你的密码"; python scripts/init_agent_db.py # 方式二:命令行传参 python scripts/init_agent_db.py --mysql-password 123456 # 可选参数 python scripts/init_agent_db.py --mysql-host 127.0.0.1 --mysql-port 3306 --mysql-user root 说明: - 全新机器首次执行即可建齐:底座 11 张(01)+ Agent 专用 7 张(02); - CREATE DATABASE 带 IF NOT EXISTS;表已存在时 MySQL 报 1050,脚本提示后安全跳过, 不会 DROP 任何数据(如需彻底重建,请手动 DROP DATABASE jinrong_agent 后重跑); - 游客审计依赖 jinrong_agent.audit_log(在 01 中),客服归档/备注依赖 02 中的表。 """ from __future__ import annotations import argparse import os import sys from pathlib import Path import pymysql from pymysql.constants import CLIENT from pymysql.err import OperationalError ROOT = Path(__file__).resolve().parent.parent SQL_FILES = [ ("01-共用底座", ROOT / "docs/项目框架设计/表设计/01-mysql-共用底座.sql"), ("02-agent专用", ROOT / "docs/项目框架设计/表设计/02-mysql-agent专用.sql"), ] ER_TABLE_EXISTS = 1050 def run_sql_file(cur, label: str, path: Path) -> None: if not path.exists(): print(f"[ERROR] SQL 文件不存在: {path}") sys.exit(1) print(f">> 执行 {label}: {path.name}") sql = path.read_text(encoding="utf-8") try: cur.execute(sql) while cur.nextset(): pass print(f" {label} 执行完成") except OperationalError as e: # 1050 = 表已存在:非全新环境重跑的预期情况,安全跳过,不破坏数据 if e.args and e.args[0] == ER_TABLE_EXISTS: print(f" [SKIP] {label} 部分表已存在(1050),跳过已建表;如需重建请先 DROP DATABASE jinrong_agent") else: raise def main() -> None: parser = argparse.ArgumentParser(description="初始化 jinrong_agent 库(01 底座 + 02 Agent 专用)") parser.add_argument("--mysql-host", default=os.getenv("MYSQL_HOST", "127.0.0.1")) parser.add_argument("--mysql-port", type=int, default=int(os.getenv("MYSQL_PORT", "3306"))) parser.add_argument("--mysql-user", default=os.getenv("MYSQL_USER", "root")) parser.add_argument("--mysql-password", default=os.getenv("MYSQL_PWD", ""), help="MySQL 密码;也可用 MYSQL_PWD 环境变量") args = parser.parse_args() if not args.mysql_password: print("[ERROR] 缺少密码:请用 --mysql-password 传参,或预设 MYSQL_PWD 环境变量") sys.exit(1) conn = pymysql.connect( host=args.mysql_host, port=args.mysql_port, user=args.mysql_user, password=args.mysql_password, charset="utf8mb4", client_flag=CLIENT.MULTI_STATEMENTS, autocommit=True, ) try: with conn.cursor() as cur: for label, path in SQL_FILES: run_sql_file(cur, label, path) cur.execute("USE jinrong_agent") cur.execute("SHOW TABLES") tables = [r[0] for r in cur.fetchall()] print(f"\njinrong_agent 现有 {len(tables)} 张表:") for t in tables: print(f" - {t}") finally: conn.close() if __name__ == "__main__": main()