migrate_add_implemented_tools.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #!/usr/bin/env python3
  2. """
  3. 数据库迁移脚本:为 tool_table 添加 implemented_tool_ids 字段
  4. 该字段用于存储工具库中实际接入的工具 ID 列表,建立工具描述与实际实现之间的映射关系。
  5. """
  6. import os
  7. import sys
  8. import psycopg2
  9. from psycopg2.extras import RealDictCursor
  10. from dotenv import load_dotenv
  11. # 加载环境变量
  12. _script_dir = os.path.dirname(os.path.abspath(__file__))
  13. _project_root = os.path.normpath(os.path.join(_script_dir, '..', '..'))
  14. load_dotenv(os.path.join(_project_root, '.env'))
  15. def get_connection():
  16. """建立数据库连接"""
  17. host = os.getenv('KNOWHUB_DB')
  18. port = int(os.getenv('KNOWHUB_PORT', 5432))
  19. user = os.getenv('KNOWHUB_USER')
  20. password = os.getenv('KNOWHUB_PASSWORD')
  21. dbname = os.getenv('KNOWHUB_DB_NAME')
  22. print(f"连接到 {host}:{port}/{dbname} as {user} ...")
  23. conn = psycopg2.connect(
  24. host=host,
  25. port=port,
  26. user=user,
  27. password=password,
  28. database=dbname,
  29. connect_timeout=10
  30. )
  31. conn.autocommit = True
  32. print("连接成功。")
  33. return conn
  34. def main():
  35. print("=" * 60)
  36. print("开始迁移:添加 tool_table.implemented_tool_ids 字段")
  37. print("=" * 60)
  38. conn = get_connection()
  39. cursor = conn.cursor(cursor_factory=RealDictCursor)
  40. # 检查字段是否已存在
  41. cursor.execute("""
  42. SELECT column_name
  43. FROM information_schema.columns
  44. WHERE table_name = 'tool_table' AND column_name = 'implemented_tool_ids'
  45. """)
  46. if cursor.fetchone():
  47. print("\n字段 'implemented_tool_ids' 已存在,跳过迁移。")
  48. else:
  49. print("\n添加字段 'implemented_tool_ids' ...")
  50. cursor.execute("""
  51. ALTER TABLE tool_table
  52. ADD COLUMN implemented_tool_ids JSONB DEFAULT '[]'
  53. """)
  54. print("✓ 字段添加成功")
  55. # 验证结果
  56. print("\n" + "=" * 60)
  57. print("验证结果:")
  58. print("=" * 60)
  59. cursor.execute("""
  60. SELECT column_name, data_type, column_default
  61. FROM information_schema.columns
  62. WHERE table_name = 'tool_table'
  63. ORDER BY ordinal_position
  64. """)
  65. print("\ntool_table 当前字段:")
  66. for row in cursor.fetchall():
  67. print(f" - {row['column_name']}: {row['data_type']} (默认: {row['column_default']})")
  68. cursor.execute("SELECT COUNT(*) as count FROM tool_table")
  69. count = cursor.fetchone()['count']
  70. print(f"\n总记录数: {count}")
  71. cursor.close()
  72. conn.close()
  73. print("\n迁移完成!")
  74. if __name__ == '__main__':
  75. main()