老婆出轨 发表于 2025-4-27 06:54:35

Dify数据库导出知识库

1.Dify 的数据库表结构

Dify 的知识库数据主要存储在以下几个核心表中(不同版本可能略有差异):
表名阐明datasets存储知识库(数据集)的元信息,如 id, name, created_at 等。documents存储文档的基本信息,如 id, dataset_id, name, status 等。document_segments存储文档的分块内容(向量化处理的文本片段),包含实际文本和向量数据。 2.查询语句

(1)查询所有知识库列表

SELECT id, name, description, created_at
FROM datasets; https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYmEyYTFlNmY1MTVhNDU0N2I4NTdmOTc2ODg4NDZiMTQucG5n
(2)查询某个知识库下的所有文档

SELECT id, name, indexing_status, created_at
FROM documents
WHERE dataset_id = '173c507d-725b-457e-8848-cadb59492049';-- 替换为实际的 dataset_id https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYjkzYjgwNjBiNGUyNGVlMWFlNWU1NjhjZTgzMzQ0YWUucG5n
(3)查询文档的原始内容(分块文本)

SELECT ds.content, ds.answer
FROM document_segments ds
JOIN documents d ON ds.document_id = d.id
WHERE d.dataset_id = '173c507d-725b-457e-8848-cadb59492049'; https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNTJjNjcyOGFmMDEwNDI1YWI3MDY5MzU1NGQxZTQ2ZjUucG5n
如果只需要导出分段,直接导出即可
(4)导出知识库完备内容(文档 + 分块文本)

SELECT
    d.name AS document_name,
    ds.content AS text_chunk
FROM documents d
JOIN document_segments ds ON d.id = ds.document_id
WHERE d.dataset_id = '173c507d-725b-457e-8848-cadb59492049'; https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvYzk2MTRjYTM0ZjJmNGZmYWFkY2VmYjk1NTBlZWMwMGUucG5n

3.python导出(另外一种方法)


import psycopg2# 如果是 PostgreSQL
# import pymysql# 如果是 MySQL(取消注释并替换 psycopg2)
import csv
from datetime import datetime

def export_knowledge_to_csv(db_config, dataset_id, output_csv):
    """
    从 Dify 数据库导出知识库内容到 CSV
    :param db_config: 数据库连接配置
    :param dataset_id: 目标知识库 ID (如 'dataset-xxx')
    :param output_csv: 输出 CSV 文件路径 (如 'knowledge_export.csv')
    """
    try:
      # 连接数据库
      conn = psycopg2.connect(**db_config)
      cursor = conn.cursor()

      # 查询知识库名称(用于 CSV 头部信息)
      cursor.execute("SELECT name FROM datasets WHERE id = %s", (dataset_id,))
      dataset_name = cursor.fetchone() if cursor.rowcount > 0 else 'Unknown'

      # 查询文档及分块内容
      # query = """
      #   SELECT
      #         d.name AS document_name,
      #         ds.content AS text_chunk,
      #         LENGTH(ds.content) AS char_count,
      #         d.created_at AS doc_created_time
      #   FROM documents d
      #   JOIN document_segments ds ON d.id = ds.document_id
      #   WHERE d.dataset_id = %s
      #   ORDER BY d.created_at, d.name
      # """
      #只导出某个文档片段
      query = """
            SELECT
                d.name AS document_name,
                ds.content AS text_chunk,
                ds.answer AS answer,
                LENGTH(ds.content) AS char_count,
                d.created_at AS doc_created_time
            FROM documents d
            JOIN document_segments ds ON d.id = ds.document_id
            WHERE d.dataset_id = %s and d.id='33104412-xxx'#替换成你的文档id
            ORDER BY d.created_at, d.name
      """

      cursor.execute(query, (dataset_id,))
      rows = cursor.fetchall()

      # 写入 CSV
      with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
            writer = csv.writer(csvfile)
            # 写入元数据标题
            writer.writerow()
            writer.writerow([])# 空行分隔
            # 写入数据列标题
            writer.writerow(["Document Name", "Text Chunk","answer", "Character Count", "Created Time"])

            for row in rows:
                # 清理文本中的换行符(避免 CSV 格式混乱)
                cleaned_text = row.replace('\n', ' ').replace('\r', ' ')
                writer.writerow(, cleaned_text, row, row])

      print(f"成功导出 {len(rows)} 条记录到 {output_csv}")

    except Exception as e:
      print(f"导出失败: {str(e)}")
    finally:
      if 'cursor' in locals(): cursor.close()
      if 'conn' in locals(): conn.close()

# 使用示例
if __name__ == "__main__":
    # 数据库配置(根据实际修改)
    db_config = {
      "host": "192.168.xx.xx",
      "database": "dify",
      "user": "xx",
      "password": "xxxx",
      "port": 5432# PostgreSQL 默认端口
    }

    export_knowledge_to_csv(
      db_config=db_config,
      dataset_id="afe88740-0004-493a-xxxxxx",# 替换为你的知识库 ID
      output_csv="dify_knowledge_export.csv"
    ) 导出的结果如下:
https://dis.qidao123.com/imgproxy/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9kaXJlY3QvNzNkY2VlNjI4YjU1NDc1MGEzMmNmMDJmMjVkYzQyYTAucG5n
页: [1]
查看完整版本: Dify数据库导出知识库