Ver Fonte

准备开发data_source相关的API

wangxq há 1 mês atrás
pai
commit
68f974c46e
2 ficheiros alterados com 60 adições e 65 exclusões
  1. 40 49
      app/api/data_resource/routes.py
  2. 20 16
      app/core/llm/ddl_parser.py

+ 40 - 49
app/api/data_resource/routes.py

@@ -603,28 +603,25 @@ def ddl_identify():
         if not ddl_list:
             return jsonify(failed("未找到有效的CREATE TABLE语句"))
         
-        # 创建最终返回结果的结构
+        # 处理结果 - 假设ddl_list已经包含tables结构
         result = {}
         data_source = None
-        tables = {}
             
-        # 为每个表名添加exist字段
+        # 处理数据源和表的存在状态
         if isinstance(ddl_list, dict):
-            # 检查是否有data_source键
+            # 处理数据源信息
             if "data_source" in ddl_list:
-                # 提取数据源信息
                 data_source = ddl_list.pop("data_source", None)
                 
-                # 检查数据源是否存在
                 if data_source:
                     # 检查数据源是否包含en_name
                     if "en_name" not in data_source:
+                        logger.debug(f"data_source内容: {json.dumps(data_source, ensure_ascii=False) if data_source is not None else 'None'}")
                         return jsonify(failed("数据源信息不完整:缺少en_name字段"))
                         
                     try:
-                        # 使用Neo4j查询检查数据源是否存在
+                        # 查询数据源是否存在
                         data_source_name = data_source["en_name"]
-                        # 注意:数据源的标签应该是data_source而不是data_resource
                         with neo4j_driver.get_session() as session:
                             source_query = """
                             MATCH (n:data_source {en_name: $name})
@@ -640,48 +637,42 @@ def ddl_identify():
                         logger.error(f"检查数据源存在状态失败: {str(e)}")
                         data_source["exist"] = False
             
-            # 获取所有表名 - 过滤掉可能的非表结构键
-            table_names = []
-            for key, value in list(ddl_list.items()):
-                # 检查值是否是字典且包含meta键,这表明它是一个表结构
-                if isinstance(value, dict) and "meta" in value:
-                    table_names.append(key)
-                    # 将表信息添加到tables字典中
-                    tables[key] = value
-                # 如果不是表结构,则不处理
-            
-            # 只有在有表名时才查询表是否存在
-            if table_names:
-                try:
-                    # 在Neo4j中查询表名是否存在于data_resource节点
-                    with neo4j_driver.get_session() as session:
-                        table_query = """
-                        UNWIND $names AS name
-                        OPTIONAL MATCH (n:data_resource {en_name: name})
-                        RETURN name, n IS NOT NULL AS exists
-                        """
-                        table_results = session.run(table_query, names=table_names)
-                        
-                        # 处理结果
-                        for record in table_results:
-                            table_name = record["name"]
-                            exists = record["exists"]
-                            if table_name in tables:
-                                tables[table_name]["exist"] = exists
-                        
-                        # 确保所有表都有exist字段
+            # 处理表的存在状态 - 假设tables已经在ddl_list中
+            if "tables" in ddl_list and isinstance(ddl_list["tables"], dict):
+                table_names = list(ddl_list["tables"].keys())
+                
+                if table_names:
+                    try:
+                        # 查询表是否存在
+                        with neo4j_driver.get_session() as session:
+                            table_query = """
+                            UNWIND $names AS name
+                            OPTIONAL MATCH (n:data_resource {en_name: name})
+                            RETURN name, n IS NOT NULL AS exists
+                            """
+                            table_results = session.run(table_query, names=table_names)
+                            
+                            # 处理结果
+                            for record in table_results:
+                                table_name = record["name"]
+                                exists = record["exists"]
+                                if table_name in ddl_list["tables"]:
+                                    ddl_list["tables"][table_name]["exist"] = exists
+                            
+                            # 确保所有表都有exist字段
+                            for table_name in table_names:
+                                if "exist" not in ddl_list["tables"][table_name]:
+                                    ddl_list["tables"][table_name]["exist"] = False
+                    except Exception as e:
+                        logger.error(f"检查表存在状态失败: {str(e)}")
+                        # 如果查询失败,所有表默认为不存在
                         for table_name in table_names:
-                            if "exist" not in tables[table_name]:
-                                tables[table_name]["exist"] = False
-                                
-                except Exception as e:
-                    logger.error(f"检查表存在状态失败: {str(e)}")
-                    # 如果查询失败,所有表默认为不存在
-                    for table_name in table_names:
-                        tables[table_name]["exist"] = False
-        
-        # 构建最终返回的结构
-        result["tables"] = tables
+                            ddl_list["tables"][table_name]["exist"] = False
+            
+            # 构建最终结果
+            result = ddl_list
+        
+        # 添加数据源信息
         if data_source:
             result["data_source"] = data_source
         

+ 20 - 16
app/core/llm/ddl_parser.py

@@ -105,7 +105,9 @@ class DDLParser:
    - 如无注释但字段名有明确含义,将英文名翻译为中文
    - 如字段名是无意义的拼音缩写,则name为空字符串
    - 字段名中不要出现逗号,以及"主键"、"外键"、"索引"等字样
-4. 数据库连接串处理:
+4. 所有的表的定义信息,请放在tables对象中, tables对象的key为表名,value为表的定义信息。这里可能会有多个表,请一一识别。
+5. data_source对象,请放在data_source标签中,它与tables对象同级。
+6. 数据库连接串处理:
    - 将连接串识别后并拆解为:主机名/IP地址、端口、数据库名称、用户名、密码。
    - 根据连接串格式识别数据库类型,数据库类型请使用小写,参考例子,如 mysql/postgresql/sqlserver/oracle/db2/sybase
    - data_source.en_name格式为: "{数据库名称}_{hostname或ip地址}_{端口}_{数据库用户名}",如某个元素无法识别,则跳过不添加.
@@ -113,22 +115,24 @@ class DDLParser:
    - 无法确定数据库类型时,type设为"unknown"
    - 如果从ddl中没有识别到数据库连接串,则json不返回"data_source"标签
    - 除了database,password,username,en_name,host,port,type,name 之外,连接串的其它字段放在param属性中。
-5. 参考格式如下:
+7. 参考格式如下:
 {
-    "users": { //表名
-        "name": "用户表", //表的中文名,来自于COMMENT注释或LLM翻译,如果无法确定,则name为空字符串
-        "schema": "public",
-        "meta": [{
-                "en_name": "id",
-                "data_type": "integer",
-                "name": "用户ID"
-            },
-            {
-                "en_name": "username",
-                "data_type": "varchar",
-                "name": "用户名"
-            }
-        ]
+    "tables": {
+        "users": { //表名
+            "name": "用户表", //表的中文名,来自于COMMENT注释或LLM翻译,如果无法确定,则name为空字符串
+            "schema": "public",
+            "meta": [{
+                    "en_name": "id",
+                    "data_type": "integer",
+                    "name": "用户ID"
+                },
+                {
+                    "en_name": "username",
+                    "data_type": "varchar",
+                    "name": "用户名"
+                }
+            ]
+        }
     },
     "data_source": [{
         "en_name": "mydatabase_10.52.31.104_5432_myuser", //{数据库名称}_{hostname或ip地址}_{端口}_{数据库用户名}