这个案例是测试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的执行顺序,点击展开可以看到每个节点的入参和返回,方便我们调试知道哪个节点出了问题
