create_tables.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #!/usr/bin/env python3
  2. """
  3. 创建 tool_table, skill_table, requirement_table 三张新表
  4. """
  5. import os
  6. import psycopg2
  7. from psycopg2.extras import RealDictCursor
  8. from dotenv import load_dotenv
  9. load_dotenv()
  10. CREATE_TOOL_TABLE = """
  11. CREATE TABLE IF NOT EXISTS tool_table (
  12. id VARCHAR(64) PRIMARY KEY,
  13. name VARCHAR(255) NOT NULL,
  14. version VARCHAR(64),
  15. introduction TEXT,
  16. tutorial TEXT,
  17. input JSONB,
  18. output JSONB,
  19. updated_time BIGINT,
  20. status VARCHAR(32) DEFAULT '未接入', -- 未接入/可用/异常
  21. knowledge JSONB DEFAULT '[]', -- 关联知识条目
  22. case_knowledge JSONB DEFAULT '[]', -- 用例知识
  23. process_knowledge JSONB DEFAULT '[]' -- 工序知识
  24. ) WITH (appendoptimized=false);
  25. """
  26. CREATE_SKILL_TABLE = """
  27. CREATE TABLE IF NOT EXISTS skill_table (
  28. id VARCHAR(64) PRIMARY KEY,
  29. name VARCHAR(255) NOT NULL,
  30. version VARCHAR(64),
  31. introduction TEXT,
  32. input JSONB,
  33. output JSONB,
  34. updated_time BIGINT,
  35. resource_id VARCHAR(64), -- 关联的工具id (resource.id)
  36. knowledge JSONB DEFAULT '[]', -- 关联知识条目
  37. case_knowledge JSONB DEFAULT '[]', -- 用例知识
  38. process_knowledge JSONB DEFAULT '[]', -- 工序知识
  39. status VARCHAR(32) DEFAULT '未验证' -- 未验证/可用/异常
  40. ) WITH (appendoptimized=false);
  41. """
  42. CREATE_REQUIREMENT_TABLE = """
  43. CREATE TABLE IF NOT EXISTS requirement_table (
  44. id VARCHAR(64) PRIMARY KEY,
  45. task TEXT, -- 任务需求
  46. type VARCHAR(64), -- 制作/...
  47. source_type VARCHAR(64), -- itemset
  48. source_itemset_id VARCHAR(64), -- 关联pattern的id
  49. source_items JSONB DEFAULT '[]', -- 包含的特征/分类
  50. tools JSONB DEFAULT '[]', -- 关联的工具id与简介
  51. knowledge JSONB DEFAULT '[]', -- 关联知识条目
  52. case_knowledge JSONB DEFAULT '[]', -- 用例知识
  53. process_knowledge JSONB DEFAULT '[]', -- 工序知识
  54. trace JSONB DEFAULT '[]', -- 关联的任务执行log
  55. body TEXT, -- str/json
  56. embedding float4[] -- 向量(1536维)
  57. ) WITH (appendoptimized=false);
  58. """
  59. CREATE_REQUIREMENT_EMBEDDING_INDEX = """
  60. CREATE INDEX IF NOT EXISTS idx_requirement_embedding
  61. ON requirement_table USING ann(embedding)
  62. WITH (dim=1536, hnsw_m=16, pq_enable=0);
  63. """
  64. def create_tables():
  65. conn = psycopg2.connect(
  66. host=os.getenv('KNOWHUB_DB'),
  67. port=int(os.getenv('KNOWHUB_PORT', 5432)),
  68. user=os.getenv('KNOWHUB_USER'),
  69. password=os.getenv('KNOWHUB_PASSWORD'),
  70. database=os.getenv('KNOWHUB_DB_NAME')
  71. )
  72. conn.autocommit = True
  73. cursor = conn.cursor(cursor_factory=RealDictCursor)
  74. tables = [
  75. ("tool_table", CREATE_TOOL_TABLE),
  76. ("skill_table", CREATE_SKILL_TABLE),
  77. ("requirement_table", CREATE_REQUIREMENT_TABLE),
  78. ]
  79. for name, sql in tables:
  80. try:
  81. cursor.execute(sql)
  82. print(f"✅ {name} 创建成功")
  83. except Exception as e:
  84. print(f"❌ {name} 创建失败: {e}")
  85. try:
  86. cursor.execute(CREATE_REQUIREMENT_EMBEDDING_INDEX)
  87. print("✅ requirement_table fastann 索引创建成功")
  88. except Exception as e:
  89. print(f"❌ requirement_table 索引创建失败: {e}")
  90. # 验证
  91. cursor.execute("""
  92. SELECT tablename FROM pg_tables
  93. WHERE schemaname = 'public'
  94. ORDER BY tablename;
  95. """)
  96. tables_now = cursor.fetchall()
  97. print(f"\n当前所有表 ({len(tables_now)}个):")
  98. for t in tables_now:
  99. print(f" - {t['tablename']}")
  100. cursor.close()
  101. conn.close()
  102. if __name__ == "__main__":
  103. create_tables()