Dify使用ChatFlow实现调用数据库问答

这个案例是测试demo!!!线上使用一定要注意数据安全问题!!!

Docker部署Dify看这里:win11系统使用DockerDesktop搭建Dify实现知识库问答

1、新增业务知识库,里面是库表结构和描述(借样是我公司的某块业务)

文档内容如下:

复制代码
-- 这个是用户信息表
CREATE TABLE `user` (
	`user_id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT '用户ID(主键)',
	`user_name` VARCHAR(50) NOT NULL COMMENT '用户姓名/借样人' COLLATE 'utf8mb4_0900_ai_ci',
	`phone` VARCHAR(20) NULL DEFAULT NULL COMMENT '联系电话' COLLATE 'utf8mb4_0900_ai_ci',
	`department` VARCHAR(50) NULL DEFAULT NULL COMMENT '所属部门' COLLATE 'utf8mb4_0900_ai_ci',
	`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	PRIMARY KEY (`user_id`) USING BTREE,
	INDEX `idx_user_name` (`user_name`) USING BTREE
)
COMMENT='用户表(借样人信息)'
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

-- 这是借样明细中sku的具体信息表
CREATE TABLE `sku_info` (
	`id` BIGINT(19) NOT NULL AUTO_INCREMENT,
	`sku_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT 'SKU唯一标识(主键)' COLLATE 'utf8mb4_0900_ai_ci',
	`model_no` VARCHAR(50) NOT NULL COMMENT '款号' COLLATE 'utf8mb4_0900_ai_ci',
	`cost_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',
	`marketing_price` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '吊牌价',
	`sku_name` VARCHAR(100) NULL DEFAULT NULL COMMENT '衣服名称/描述' COLLATE 'utf8mb4_0900_ai_ci',
	`status` TINYINT(3) NOT NULL DEFAULT '1' COMMENT '状态 1=正常 0=禁用',
	`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	PRIMARY KEY (`id`) USING BTREE,
	UNIQUE INDEX `uk_sku_id` (`sku_id`) USING BTREE,
	INDEX `idx_model_no` (`model_no`) USING BTREE
)
COMMENT='SKU衣服信息表'
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

-- 这个是借样主表
CREATE TABLE `sample_borrow_master` (
	`borrow_id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT '借样单ID(主键)',
	`borrow_no` VARCHAR(32) NOT NULL COMMENT '借样单号(业务唯一编号)' COLLATE 'utf8mb4_0900_ai_ci',
	`user_id` BIGINT(19) NOT NULL COMMENT '借样人ID(关联用户表)',
	`borrow_time` DATETIME NOT NULL COMMENT '借样时间',
	`total_quantity` INT(10) NOT NULL DEFAULT '0' COMMENT '借样总数量',
	`total_amount` DECIMAL(12,2) NOT NULL DEFAULT '0.00' COMMENT '借样总金额',
	`has_return` TINYINT(3) NOT NULL DEFAULT '0' COMMENT '是否需要归还 0=不需要 1=需要',
	`expected_return_time` DATE NULL DEFAULT NULL COMMENT '预计还样日期',
	`borrow_status` TINYINT(3) NOT NULL DEFAULT '1' COMMENT '借样状态 1=借样中 2=已归还 3=逾期 4=作废',
	`remark` VARCHAR(255) NULL DEFAULT NULL COMMENT '备注' COLLATE 'utf8mb4_0900_ai_ci',
	`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
	PRIMARY KEY (`borrow_id`) USING BTREE,
	UNIQUE INDEX `uk_borrow_no` (`borrow_no`) USING BTREE,
	INDEX `idx_user_id` (`user_id`) USING BTREE,
	INDEX `idx_borrow_status` (`borrow_status`) USING BTREE
)
COMMENT='借样主表'
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

-- 这个是借样明细表
CREATE TABLE `sample_borrow_sku_detail` (
	`detail_id` BIGINT(19) NOT NULL AUTO_INCREMENT COMMENT '明细ID(主键)',
	`borrow_no` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '借样单号' COLLATE 'utf8mb4_0900_ai_ci',
	`sku_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '衣服SKU ID' COLLATE 'utf8mb4_0900_ai_ci',
	`model_no` VARCHAR(50) NOT NULL COMMENT '款号(冗余存储)' COLLATE 'utf8mb4_0900_ai_ci',
	`borrow_quantity` INT(10) NOT NULL DEFAULT '1' COMMENT '本次借样数量',
	`cost_price` DECIMAL(10,2) NOT NULL COMMENT '借样时成本价(快照)',
	`return_quantity` INT(10) NOT NULL DEFAULT '0' COMMENT '本次归还数量',
	`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
	PRIMARY KEY (`detail_id`) USING BTREE,
	INDEX `idx_sku_id` (`sku_id`) USING BTREE,
	INDEX `idx_borrow_id` (`borrow_no`) USING BTREE
)
COMMENT='借样SKU明细表'
COLLATE='utf8mb4_0900_ai_ci'
ENGINE=InnoDB
;

2、下面是我流程中的DSL语句,可以直接导入:

复制代码
app:
  description: ''
  icon: 🤖
  icon_background: '#FFEAD5'
  icon_type: emoji
  mode: advanced-chat
  name: 借样查询
  use_icon_as_answer_icon: false
dependencies:
- current_identifier: null
  type: marketplace
  value:
    marketplace_plugin_unique_identifier: langgenius/deepseek:0.0.12@37699cc3d1ea9e006348a7273a514f3ddf60ffb0649dc735c594c8da6a80934b
    version: null
- current_identifier: null
  type: marketplace
  value:
    marketplace_plugin_unique_identifier: langgenius/tongyi:0.1.36@73e3e28eca163b96da65ef9eab8633f9e7257213ff0d2f2bed93b28b552d2cda
    version: null
kind: app
version: 0.6.0
workflow:
  conversation_variables: []
  environment_variables: []
  features:
    file_upload:
      allowed_file_extensions:
      - .JPG
      - .JPEG
      - .PNG
      - .GIF
      - .WEBP
      - .SVG
      allowed_file_types:
      - image
      allowed_file_upload_methods:
      - local_file
      - remote_url
      enabled: false
      fileUploadConfig:
        attachment_image_file_size_limit: 2
        audio_file_size_limit: 50
        batch_count_limit: 5
        file_size_limit: 15
        file_upload_limit: 20
        image_file_batch_limit: 10
        image_file_size_limit: 10
        single_chunk_attachment_limit: 10
        video_file_size_limit: 100
        workflow_file_upload_limit: 10
      image:
        enabled: false
        number_limits: 3
        transfer_methods:
        - local_file
        - remote_url
      number_limits: 3
    opening_statement: ''
    retriever_resource:
      enabled: true
    sensitive_word_avoidance:
      enabled: false
    speech_to_text:
      enabled: false
    suggested_questions: []
    suggested_questions_after_answer:
      enabled: false
    text_to_speech:
      enabled: false
      language: ''
      voice: ''
  graph:
    edges:
    - data:
        isInLoop: false
        sourceType: start
        targetType: knowledge-retrieval
      id: 1776662347801-source-1776662353911-target
      selected: false
      source: '1776662347801'
      sourceHandle: source
      target: '1776662353911'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: answer
      id: 1776665066634-source-answer-target
      selected: false
      source: '1776665066634'
      sourceHandle: source
      target: answer
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: code
        targetType: llm
      id: 1776668184597-source-1776665066634-target
      selected: false
      source: '1776668184597'
      sourceHandle: source
      target: '1776665066634'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInIteration: false
        isInLoop: false
        sourceType: if-else
        targetType: answer
      id: 1776761413109-true-1776761425550-target
      selected: false
      source: '1776761413109'
      sourceHandle: 'true'
      target: '1776761425550'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: knowledge-retrieval
        targetType: if-else
      id: 1776662353911-source-1776761413109-target
      selected: false
      source: '1776662353911'
      sourceHandle: source
      target: '1776761413109'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: llm
        targetType: code
      id: llm-source-1776668184597-target
      source: llm
      sourceHandle: source
      target: '1776668184597'
      targetHandle: target
      type: custom
      zIndex: 0
    - data:
        isInLoop: false
        sourceType: if-else
        targetType: llm
      id: 1776761413109-false-llm-target
      source: '1776761413109'
      sourceHandle: 'false'
      target: llm
      targetHandle: target
      type: custom
      zIndex: 0
    nodes:
    - data:
        selected: false
        title: 用户输入
        type: start
        variables: []
      height: 71
      id: '1776662347801'
      position:
        x: 623.278433486432
        y: 82.72096134324714
      positionAbsolute:
        x: 623.278433486432
        y: 82.72096134324714
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 242
    - data:
        context:
          enabled: true
          variable_selector:
          - '1776662353911'
          - result
        memory:
          query_prompt_template: '{{#sys.query#}}


            {{#sys.files#}}'
          role_prefix:
            assistant: ''
            user: ''
          window:
            enabled: false
            size: 10
        model:
          completion_params:
            temperature: 0.7
          mode: chat
          name: deepseek-chat
          provider: langgenius/deepseek/deepseek
        prompt_template:
        - id: 07b8c2c9-e193-4fcd-897c-4013e52d3157
          role: system
          text: "你是一位sql专家,擅长根据用户的自然语言和上下文{{#context#}}中的内容生成sql语句。\n1.为用户{{#sys.query#}}生成mysql8可执行的查询sql语句,返回的内容应当可以直接在数据库中执行,不需要额外的信息、解释、说明。\n\
            2.sql只允许生成select语句,表和字段自能来自于上下文无法生成SQL"。\n4.用户的描述只能生成知识库中的sql,不能查询mysql系统表。\n\
            5. 只返回纯SQL文本,**绝对不要返回任何markdown格式** 6. **绝对不要用```sql、```、代码块、引号包裹** \n\
            7. 不要解释、不要说明、不要多余文字 \n8. 只返回干净、可直接执行的SQL字符串 \n9. 语句结尾必须带分号"
        selected: false
        structured_output_enabled: false
        title: 根据上下问生成查询sql
        type: llm
        vision:
          enabled: false
      height: 86
      id: llm
      position:
        x: 971.598234179937
        y: 401.01699217854826
      positionAbsolute:
        x: 971.598234179937
        y: 401.01699217854826
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        answer: '{{#1776665066634.text#}}'
        selected: false
        title: 直接回复
        type: answer
        variables: []
      height: 101
      id: answer
      position:
        x: 1297.3262451959602
        y: 615.0177729986513
      positionAbsolute:
        x: 1297.3262451959602
        y: 615.0177729986513
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        dataset_ids:
        - PfSdNpxk4YwbcBlkpjy+t/AKIxk8q2YCBPncMwfneyjPoqxnK48ZRNTn9vIkT8MQ
        multiple_retrieval_config:
          reranking_enable: true
          reranking_mode: reranking_model
          reranking_model:
            model: qwen3-rerank
            provider: langgenius/tongyi/tongyi
          top_k: 4
        query_attachment_selector: []
        query_variable_selector:
        - '1776662347801'
        - sys.query
        retrieval_mode: multiple
        selected: false
        title: 知识检索
        type: knowledge-retrieval
      height: 88
      id: '1776662353911'
      position:
        x: 623.278433486432
        y: 209.49551644976043
      positionAbsolute:
        x: 623.278433486432
        y: 209.49551644976043
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        context:
          enabled: false
          variable_selector: []
        model:
          completion_params:
            temperature: 0.7
          mode: chat
          name: deepseek-chat
          provider: langgenius/deepseek/deepseek
        prompt_template:
        - id: 7eb560e2-2697-4785-bc9d-0462b9f8ddf7
          role: system
          text: 你是一个数据整理大师,如果{{#1776668184597.result#}}没有结果直接回复"没有数据",否则根据用户的提问{{#sys.query#}}和{{#1776668184597.result#}}的结果、上下文{{#context#}},来给用户输出问题的答案,
        selected: false
        title: 整理回答
        type: llm
        vision:
          enabled: false
      height: 86
      id: '1776665066634'
      position:
        x: 1291.1608226201406
        y: 471.93416658586904
      positionAbsolute:
        x: 1291.1608226201406
        y: 471.93416658586904
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        code: "# ========== 必须放最顶部!解决沙箱报错 ==========\nimport os\nos.environ[\"USER\"\
          ] = \"dify_sandbox\"\nos.environ[\"LOGNAME\"] = \"dify_sandbox\"\nos.environ[\"\
          HOME\"] = \"/tmp\"\n\n# ========== 导入库 ==========\nimport json\nimport pymysql\n\
          from datetime import datetime, date\nfrom decimal import Decimal\n\n# ==========\
          \ 数据库配置 ==========\nDB_CONFIG = {\n    \"host\": \"host.docker.internal\"\
          ,\n    \"port\": 3306,\n    \"user\": \"root\",\n    \"password\": \"123456\"\
          ,\n    \"database\": \"dify_test\",\n    \"charset\": \"utf8mb4\",\n   \
          \ \"connect_timeout\": 5\n}\n\n# ========== Dify 主方法 ==========\ndef main(sql:\
          \ str):\n    try:\n        conn = pymysql.connect(\n            host=DB_CONFIG[\"\
          host\"],\n            port=DB_CONFIG[\"port\"],\n            user=DB_CONFIG[\"\
          user\"],\n            passwd=DB_CONFIG[\"password\"],\n            db=DB_CONFIG[\"\
          database\"],\n            charset=DB_CONFIG[\"charset\"],\n            connect_timeout=DB_CONFIG[\"\
          connect_timeout\"]\n        )\n\n        cursor = conn.cursor(pymysql.cursors.DictCursor)\n\
          \        cursor.execute(sql)\n        data = cursor.fetchall()\n\n     \
          \   # 处理所有不支持的类型\n        result_data = []\n        for row in data:\n \
          \           new_row = {}\n            for k, v in row.items():\n       \
          \         if isinstance(v, (datetime, date)):\n                    new_row[k]\
          \ = str(v)\n                elif isinstance(v, Decimal):\n             \
          \       new_row[k] = float(v)\n                else:\n                 \
          \   new_row[k] = v\n            result_data.append(new_row)\n\n        #\
          \ ✅ 最终返回:JSON字符串,彻底满足 Dify 要求\n        return {\"result\": json.dumps(result_data,\
          \ ensure_ascii=False)}\n\n    except Exception as e:\n        return {\"\
          result\": json.dumps({\"error\": str(e)}, ensure_ascii=False)}\n    \n \
          \   finally:\n        try:\n            cursor.close()\n            conn.close()\n\
          \        except:\n            pass"
        code_language: python3
        outputs:
          result:
            children: null
            type: string
        selected: false
        title: 代码执行sql
        type: code
        variables:
        - value_selector:
          - llm
          - text
          value_type: string
          variable: sql
      height: 50
      id: '1776668184597'
      position:
        x: 1297.3262451959602
        y: 361.3341597536339
      positionAbsolute:
        x: 1297.3262451959602
        y: 361.3341597536339
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        cases:
        - case_id: 'true'
          conditions:
          - comparison_operator: empty
            id: 816e7b0d-fd66-47fb-a2a4-68d1b4d7c82b
            value: ''
            varType: array[object]
            variable_selector:
            - '1776662353911'
            - result
          id: 'true'
          logical_operator: and
        selected: false
        title: 条件分支
        type: if-else
      height: 122
      id: '1776761413109'
      position:
        x: 571.1032302616948
        y: 361.3341597536339
      positionAbsolute:
        x: 571.1032302616948
        y: 361.3341597536339
      selected: false
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    - data:
        answer: 没有数据
        selected: false
        title: 直接回复 2
        type: answer
        variables: []
      height: 98
      id: '1776761425550'
      position:
        x: 1291.1608226201406
        y: 250.45026309480613
      positionAbsolute:
        x: 1291.1608226201406
        y: 250.45026309480613
      selected: true
      sourcePosition: right
      targetPosition: left
      type: custom
      width: 241
    viewport:
      x: -188.68186066921248
      y: -13.814952283547143
      zoom: 0.680394980652853
  rag_pipeline_variables: []

导入后的样子

下面是测试数据库表和数据,mysql安装在物理机上,docker也是安装在同一台机器上:

复制代码
-- --------------------------------------------------------
-- 主机:                           127.0.0.1
-- 服务器版本:                        8.1.0 - MySQL Community Server - GPL
-- 服务器操作系统:                      Win64
-- HeidiSQL 版本:                  12.1.0.6537
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES utf8 */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

-- 导出  表 dify_test.sample_borrow_master 结构
CREATE TABLE IF NOT EXISTS `sample_borrow_master` (
  `borrow_id` bigint NOT NULL AUTO_INCREMENT COMMENT '借样单ID(主键)',
  `borrow_no` varchar(32) NOT NULL COMMENT '借样单号(业务唯一编号)',
  `user_id` bigint NOT NULL COMMENT '借样人ID(关联用户表)',
  `borrow_time` datetime NOT NULL COMMENT '借样时间',
  `total_quantity` int NOT NULL DEFAULT '0' COMMENT '借样总数量',
  `total_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '借样总金额',
  `has_return` tinyint NOT NULL DEFAULT '0' COMMENT '是否需要归还 0=不需要 1=需要',
  `expected_return_time` date DEFAULT NULL COMMENT '预计还样日期',
  `borrow_status` tinyint NOT NULL DEFAULT '1' COMMENT '借样状态 1=借样中 2=已归还 3=逾期 4=作废',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`borrow_id`),
  UNIQUE KEY `uk_borrow_no` (`borrow_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_borrow_status` (`borrow_status`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='借样主表';

-- 正在导出表  dify_test.sample_borrow_master 的数据:~2 rows (大约)
INSERT IGNORE INTO `sample_borrow_master` (`borrow_id`, `borrow_no`, `user_id`, `borrow_time`, `total_quantity`, `total_amount`, `has_return`, `expected_return_time`, `borrow_status`, `remark`, `create_time`, `update_time`) VALUES
	(1, 'JY20250001', 1, '2026-04-20 13:00:40', 2, 149.00, 1, '2026-06-20', 1, NULL, '2026-04-20 13:00:40', '2026-04-20 15:03:47'),
	(2, 'JY20250002', 2, '2026-04-20 15:11:20', 3, 228.50, 1, '2026-05-20', 1, NULL, '2026-04-20 13:00:40', '2026-04-20 15:02:59');

-- 导出  表 dify_test.sample_borrow_sku_detail 结构
CREATE TABLE IF NOT EXISTS `sample_borrow_sku_detail` (
  `detail_id` bigint NOT NULL AUTO_INCREMENT COMMENT '明细ID(主键)',
  `borrow_no` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '借样单号',
  `sku_id` varchar(50) NOT NULL DEFAULT '' COMMENT '衣服SKU ID',
  `model_no` varchar(50) NOT NULL COMMENT '款号(冗余存储)',
  `borrow_quantity` int NOT NULL DEFAULT '1' COMMENT '本次借样数量',
  `cost_price` decimal(10,2) NOT NULL COMMENT '借样时成本价(快照)',
  `return_quantity` int NOT NULL DEFAULT '0' COMMENT '本次归还数量',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`detail_id`),
  KEY `idx_sku_id` (`sku_id`),
  KEY `idx_borrow_id` (`borrow_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='借样SKU明细表';

-- 正在导出表  dify_test.sample_borrow_sku_detail 的数据:~4 rows (大约)
INSERT IGNORE INTO `sample_borrow_sku_detail` (`detail_id`, `borrow_no`, `sku_id`, `model_no`, `borrow_quantity`, `cost_price`, `return_quantity`, `create_time`) VALUES
	(1, 'JY20250001', 'sku-001', 'model-001', 1, 69.50, 0, '2026-04-20 13:00:40'),
	(2, 'JY20250001', 'sku-002', 'model-001', 1, 79.50, 0, '2026-04-20 13:00:40'),
	(3, 'JY20250002', 'sku-001', 'model-001', 1, 69.50, 0, '2026-04-20 13:01:08'),
	(4, 'JY20250002', 'sku-002', 'model-001', 2, 79.50, 0, '2026-04-20 13:01:08');

-- 导出  表 dify_test.sku_info 结构
CREATE TABLE IF NOT EXISTS `sku_info` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `sku_id` varchar(50) NOT NULL DEFAULT '' COMMENT 'SKU唯一标识(主键)',
  `model_no` varchar(50) NOT NULL COMMENT '款号',
  `cost_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '成本价',
  `marketing_price` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '吊牌价',
  `sku_name` varchar(100) DEFAULT NULL COMMENT '衣服名称/描述',
  `status` tinyint NOT NULL DEFAULT '1' COMMENT '状态 1=正常 0=禁用',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uk_sku_id` (`sku_id`) USING BTREE,
  KEY `idx_model_no` (`model_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='SKU衣服信息表';

-- 正在导出表  dify_test.sku_info 的数据:~2 rows (大约)
INSERT IGNORE INTO `sku_info` (`id`, `sku_id`, `model_no`, `cost_price`, `marketing_price`, `sku_name`, `status`, `create_time`, `update_time`) VALUES
	(1, 'sku-001', 'model-001', 69.50, 399.00, 'sku-name-001', 1, '2026-04-20 13:02:40', '2026-04-20 13:04:23'),
	(2, 'sku-002', 'model-001', 79.50, 499.00, 'sku-name-002', 1, '2026-04-20 13:02:40', '2026-04-20 13:11:15');

-- 导出  表 dify_test.user 结构
CREATE TABLE IF NOT EXISTS `user` (
  `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID(主键)',
  `user_name` varchar(50) NOT NULL COMMENT '用户姓名/借样人',
  `phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
  `department` varchar(50) DEFAULT NULL COMMENT '所属部门',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`user_id`),
  KEY `idx_user_name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表(借样人信息)';

-- 正在导出表  dify_test.user 的数据:~1 rows (大约)
INSERT IGNORE INTO `user` (`user_id`, `user_name`, `phone`, `department`, `create_time`, `update_time`) VALUES
	(1, 'David', '13131313131', '信息中心', '2026-04-20 13:05:46', '2026-04-20 13:06:05'),
	(2, '阿三', '13131313131', '信息中心', '2026-04-20 13:05:46', '2026-04-20 13:06:05');

/*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */;
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */;
/*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40111 SET SQL_NOTES=IFNULL(@OLD_SQL_NOTES, 1) */;

tip:docker容器中的服务需要调用当前物理机上的服务时,使用下面的地址:

复制代码
http://host.docker.internal

例如,mysql是安装在物理机上的,dify是安装在docker里面的,当dify里面的代码执行需要调用mysql时,就需要把这个作为ip,如下图:

主要的流程是:用户输入问题 -> 检索知识库 -> LLM根据检索结果和问题生成sql -> 运行python执行sql -> sql结果和问题交给LLM回答

现在输入问题来测试一下

点击画布底下的"查看缓存",左侧从下往上是flow的执行顺序,点击展开可以看到每个节点的入参和返回,方便我们调试知道哪个节点出了问题

相关推荐
qq_330037992 小时前
mysql如何配置多实例运行环境_单机部署多个数据库服务
jvm·数据库·python
weixin_580614002 小时前
如何防止SQL注入泄露元数据_限制数据库信息查询权限
jvm·数据库·python
2301_777599372 小时前
mysql如何编写递归存储过程_mysql max_sp_recursion_depth设置
jvm·数据库·python
ofoxcoding2 小时前
GPT-5.4 API 怎么低延迟调用?2026 年 5 种接入方案实测对比
python·gpt·ai·flask
BizViewStudio2 小时前
GEO vs SEO vs SEM:2026 年品牌流量获取的三元格局分析
大数据·运维·网络·人工智能·ai
TDengine (老段)2 小时前
工业系统中的高级分析:超越工业实时数据库
大数据·数据库·人工智能·时序数据库·tdengine
张忠琳2 小时前
【vllm】(四)vLLM v1 Worker — 模块超深度逐行分析之二
ai·架构·vllm
程序边界2 小时前
NFS环境下数据库安装报错解析(下篇):从踩坑到填坑的完整指南
数据库
baidu_340998822 小时前
mysql如何导出表结构而不导出数据_mysqldump无数据模式
jvm·数据库·python