dify部署与新手简单使用

docker部署

下载项目

windows直接点下载zip即可

https://github.com/langgenius/dify?tab=readme-ov-file

linux以及mac请运行

git clone https://github.com/langgenius/dify.git

快速启动(均使用默认配置)

cd dify
cd docker
cp .env.example .env
docker compose up -d

访问

浏览器输入 http://127.0.0.1/
在这里插入图片描述

新手简单使用

添加模型

点击设置
在这里插入图片描述
然后安装你需要的模型供应商
在这里插入图片描述
以配置千问为例子:添加apikey即可完成
在这里插入图片描述
然后点击添加模型
在这里插入图片描述

简单对话机器人

在工作室中点击聊天助手如图所示
在这里插入图片描述
设置好提示词,这里主要是给模型做一些输出限制、思考方向、思考过程等。比如:
在这里插入图片描述
选择模型以及调整参数。这里建议使用qwen2.5或者deepseekr1对于新手来说。同时温度建议0.6
在这里插入图片描述
然后点击右下角发送问题即可对话(发布后你就可以工作室和应用中看到他了)
在这里插入图片描述

简单批量文本生成实战

选择工作室->创建工作流,随后点击开始哪里就可以看到如图标红的地方添加变量
在这里插入图片描述
然后点击LLM
在这里插入图片描述
然后在提示词中加入变量
在这里插入图片描述
然后加入节点结束,点击右上角运行即可查看测试结果
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/881617077ea3435f9dc99d65396c7a5d.png

然后点击发布即可
之后点击在探索中打开
在这里插入图片描述
然后依次点击下载模板,在模板中输入信息,即可再点击批量运行即可
在这里插入图片描述

简单NL2SQL

我们的思路是先用大模型根据对应的问题生成SQL语句,然后去数据库中执行,最后根据SQL返回的结果进行分析。所以流是这样的
在这里插入图片描述
但考虑到空荡荡的数据用户体验不够好,所以本文采用这样的流程

在这里插入图片描述

先进行个简单的NL2SQL

这个阶段先不进行SQL语句的执行,先进行SQL语句的生成。
我用AI生成了一个数据库表(mysql),直接用就行。怎么生成这么长的数据?上下文不够?不要急,后面会讲。


-- 用户表
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(50) NOT NULL UNIQUE,
  `password` VARCHAR(255) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `phone` VARCHAR(20),
  `avatar` VARCHAR(255),
  `status` TINYINT DEFAULT 1 COMMENT '0-禁用 1-正常',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品分类表
CREATE TABLE IF NOT EXISTS `categories` (
  `category_id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(100) NOT NULL,
  `parent_id` INT DEFAULT NULL,
  `level` TINYINT DEFAULT 1 COMMENT '分类层级',
  `sort_order` INT DEFAULT 0,
  `is_show` TINYINT DEFAULT 1,
  FOREIGN KEY (`parent_id`) REFERENCES `categories` (`category_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品表
CREATE TABLE IF NOT EXISTS `products` (
  `product_id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(200) NOT NULL,
  `description` TEXT,
  `price` DECIMAL(10,2) NOT NULL,
  `market_price` DECIMAL(10,2),
  `cost_price` DECIMAL(10,2),
  `stock` INT NOT NULL DEFAULT 0,
  `sold_num` INT DEFAULT 0,
  `category_id` INT,
  `main_image` VARCHAR(255),
  `status` TINYINT DEFAULT 1 COMMENT '0-下架 1-上架',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 购物车表
CREATE TABLE IF NOT EXISTS `cart` (
  `cart_id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `product_id` INT NOT NULL,
  `quantity` INT NOT NULL DEFAULT 1,
  `selected` TINYINT DEFAULT 1,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`),
  FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单表
CREATE TABLE IF NOT EXISTS `orders` (
  `order_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_no` VARCHAR(50) NOT NULL UNIQUE,
  `user_id` INT NOT NULL,
  `total_amount` DECIMAL(10,2) NOT NULL,
  `payment_amount` DECIMAL(10,2) NOT NULL,
  `shipping_fee` DECIMAL(10,2) DEFAULT 0,
  `address_id` INT,
  `status` TINYINT DEFAULT 0 COMMENT '0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',
  `payment_time` DATETIME,
  `shipping_time` DATETIME,
  `complete_time` DATETIME,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单明细表
CREATE TABLE IF NOT EXISTS `order_items` (
  `item_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_id` INT NOT NULL,
  `product_id` INT NOT NULL,
  `product_name` VARCHAR(200) NOT NULL,
  `product_image` VARCHAR(255),
  `current_price` DECIMAL(10,2) NOT NULL,
  `quantity` INT NOT NULL,
  `total_price` DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`),
  FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 收货地址表
CREATE TABLE IF NOT EXISTS `shipping_address` (
  `address_id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `receiver_name` VARCHAR(50) NOT NULL,
  `receiver_phone` VARCHAR(20) NOT NULL,
  `province` VARCHAR(50) NOT NULL,
  `city` VARCHAR(50) NOT NULL,
  `district` VARCHAR(50) NOT NULL,
  `detail_address` VARCHAR(255) NOT NULL,
  `is_default` TINYINT DEFAULT 0,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 支付记录表
CREATE TABLE IF NOT EXISTS `payment` (
  `payment_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_id` INT NOT NULL,
  `payment_no` VARCHAR(100) NOT NULL,
  `payment_method` TINYINT COMMENT '1-支付宝 2-微信 3-银联',
  `payment_amount` DECIMAL(10,2) NOT NULL,
  `payment_status` TINYINT DEFAULT 0 COMMENT '0-未支付 1-支付成功 2-支付失败',
  `payment_time` DATETIME,
  `callback_content` TEXT,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


INSERT INTO `users` (`username`,`password`,`email`,`phone`,`avatar`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'user1' AS `username`, 'pwd1' AS `password`, 'user1@example.com' AS `email`, '0995822412' AS `phone`, '/avatars/user1.png' AS `avatar`, 1 AS `status`, '2025-06-03 16:51:18' AS `created_at`, '2025-06-03 16:51:18' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `users` WHERE `username`='user1' OR `email`='user1@example.com');

INSERT INTO `users` (`username`,`password`,`email`,`phone`,`avatar`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'user2' AS `username`, 'pwd2' AS `password`, 'user2@example.com' AS `email`, '0913356886' AS `phone`, '/avatars/user2.png' AS `avatar`, 1 AS `status`, '2025-06-18 23:59:04' AS `created_at`, '2025-06-18 23:59:04' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `users` WHERE `username`='user2' OR `email`='user2@example.com');

INSERT INTO `users` (`username`,`password`,`email`,`phone`,`avatar`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'user3' AS `username`, 'pwd3' AS `password`, 'user3@example.com' AS `email`, '0946913810' AS `phone`, '/avatars/user3.png' AS `avatar`, 1 AS `status`, '2025-06-06 22:39:35' AS `created_at`, '2025-06-06 22:39:35' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `users` WHERE `username`='user3' OR `email`='user3@example.com');

INSERT INTO `users` (`username`,`password`,`email`,`phone`,`avatar`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'user4' AS `username`, 'pwd4' AS `password`, 'user4@example.com' AS `email`, '0939958838' AS `phone`, '/avatars/user4.png' AS `avatar`, 1 AS `status`, '2025-06-04 09:17:12' AS `created_at`, '2025-06-04 09:17:12' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `users` WHERE `username`='user4' OR `email`='user4@example.com');

INSERT INTO `users` (`username`,`password`,`email`,`phone`,`avatar`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'user5' AS `username`, 'pwd5' AS `password`, 'user5@example.com' AS `email`, '0923756669' AS `phone`, '/avatars/user5.png' AS `avatar`, 1 AS `status`, '2025-06-17 10:12:21' AS `created_at`, '2025-06-17 10:12:21' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `users` WHERE `username`='user5' OR `email`='user5@example.com');

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Electronics' AS `name`, NULL AS `parent_id`, 1 AS `level`, 1 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Electronics' AND parent_id IS NULL);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Laptops' AS `name`, 1 AS `parent_id`, 2 AS `level`, 2 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Laptops' AND parent_id=1);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Phones' AS `name`, 1 AS `parent_id`, 2 AS `level`, 3 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Phones' AND parent_id=1);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Tablets' AS `name`, 1 AS `parent_id`, 2 AS `level`, 4 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Tablets' AND parent_id=1);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Accessories' AS `name`, 1 AS `parent_id`, 2 AS `level`, 5 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Accessories' AND parent_id=1);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Gaming Laptops' AS `name`, 2 AS `parent_id`, 2 AS `level`, 6 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Gaming Laptops' AND parent_id=2);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Ultrabooks' AS `name`, 2 AS `parent_id`, 2 AS `level`, 7 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Ultrabooks' AND parent_id=2);

INSERT INTO `categories` (`name`,`parent_id`,`level`,`sort_order`,`is_show`)
SELECT * FROM (SELECT 'Cases' AS `name`, 5 AS `parent_id`, 2 AS `level`, 8 AS `sort_order`, 1 AS `is_show`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `categories` WHERE `name`='Cases' AND parent_id=5);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct1' AS `name`, 'Description for SampleProduct1' AS `description`, 1494.3 AS `price`, 1793.16 AS `market_price`, 1195.44 AS `cost_price`, 149 AS `stock`, 22 AS `sold_num`, 7 AS `category_id`, '/images/SampleProduct1.jpg' AS `main_image`, 1 AS `status`, '2025-06-01 18:30:53' AS `created_at`, '2025-06-01 18:30:53' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct1' AND `category_id`=7);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct2' AS `name`, 'Description for SampleProduct2' AS `description`, 108.1 AS `price`, 129.72 AS `market_price`, 86.48 AS `cost_price`, 65 AS `stock`, 29 AS `sold_num`, 1 AS `category_id`, '/images/SampleProduct2.jpg' AS `main_image`, 1 AS `status`, '2025-06-14 14:56:56' AS `created_at`, '2025-06-14 14:56:56' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct2' AND `category_id`=1);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct3' AS `name`, 'Description for SampleProduct3' AS `description`, 437.73 AS `price`, 525.28 AS `market_price`, 350.18 AS `cost_price`, 176 AS `stock`, 139 AS `sold_num`, 7 AS `category_id`, '/images/SampleProduct3.jpg' AS `main_image`, 1 AS `status`, '2025-06-06 08:24:57' AS `created_at`, '2025-06-06 08:24:57' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct3' AND `category_id`=7);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct4' AS `name`, 'Description for SampleProduct4' AS `description`, 925.96 AS `price`, 1111.15 AS `market_price`, 740.77 AS `cost_price`, 81 AS `stock`, 0 AS `sold_num`, 3 AS `category_id`, '/images/SampleProduct4.jpg' AS `main_image`, 1 AS `status`, '2025-06-17 22:41:44' AS `created_at`, '2025-06-17 22:41:44' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct4' AND `category_id`=3);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct5' AS `name`, 'Description for SampleProduct5' AS `description`, 874.1 AS `price`, 1048.92 AS `market_price`, 699.28 AS `cost_price`, 81 AS `stock`, 19 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct5.jpg' AS `main_image`, 1 AS `status`, '2025-06-19 12:46:03' AS `created_at`, '2025-06-19 12:46:03' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct5' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct6' AS `name`, 'Description for SampleProduct6' AS `description`, 706.36 AS `price`, 847.63 AS `market_price`, 565.09 AS `cost_price`, 33 AS `stock`, 24 AS `sold_num`, 2 AS `category_id`, '/images/SampleProduct6.jpg' AS `main_image`, 1 AS `status`, '2025-06-09 17:07:14' AS `created_at`, '2025-06-09 17:07:14' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct6' AND `category_id`=2);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct7' AS `name`, 'Description for SampleProduct7' AS `description`, 1702.61 AS `price`, 2043.13 AS `market_price`, 1362.09 AS `cost_price`, 164 AS `stock`, 67 AS `sold_num`, 1 AS `category_id`, '/images/SampleProduct7.jpg' AS `main_image`, 1 AS `status`, '2025-06-18 17:05:58' AS `created_at`, '2025-06-18 17:05:58' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct7' AND `category_id`=1);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct8' AS `name`, 'Description for SampleProduct8' AS `description`, 945.88 AS `price`, 1135.06 AS `market_price`, 756.7 AS `cost_price`, 41 AS `stock`, 24 AS `sold_num`, 2 AS `category_id`, '/images/SampleProduct8.jpg' AS `main_image`, 1 AS `status`, '2025-06-14 09:35:13' AS `created_at`, '2025-06-14 09:35:13' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct8' AND `category_id`=2);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct9' AS `name`, 'Description for SampleProduct9' AS `description`, 621.7 AS `price`, 746.04 AS `market_price`, 497.36 AS `cost_price`, 170 AS `stock`, 158 AS `sold_num`, 6 AS `category_id`, '/images/SampleProduct9.jpg' AS `main_image`, 1 AS `status`, '2025-06-15 00:19:55' AS `created_at`, '2025-06-15 00:19:55' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct9' AND `category_id`=6);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct10' AS `name`, 'Description for SampleProduct10' AS `description`, 424.96 AS `price`, 509.95 AS `market_price`, 339.97 AS `cost_price`, 27 AS `stock`, 1 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct10.jpg' AS `main_image`, 1 AS `status`, '2025-06-19 18:20:41' AS `created_at`, '2025-06-19 18:20:41' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct10' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct11' AS `name`, 'Description for SampleProduct11' AS `description`, 614.31 AS `price`, 737.17 AS `market_price`, 491.45 AS `cost_price`, 30 AS `stock`, 27 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct11.jpg' AS `main_image`, 1 AS `status`, '2025-06-22 00:45:47' AS `created_at`, '2025-06-22 00:45:47' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct11' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct12' AS `name`, 'Description for SampleProduct12' AS `description`, 246.95 AS `price`, 296.34 AS `market_price`, 197.56 AS `cost_price`, 81 AS `stock`, 58 AS `sold_num`, 6 AS `category_id`, '/images/SampleProduct12.jpg' AS `main_image`, 1 AS `status`, '2025-06-04 22:45:10' AS `created_at`, '2025-06-04 22:45:10' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct12' AND `category_id`=6);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct13' AS `name`, 'Description for SampleProduct13' AS `description`, 771.85 AS `price`, 926.22 AS `market_price`, 617.48 AS `cost_price`, 63 AS `stock`, 34 AS `sold_num`, 2 AS `category_id`, '/images/SampleProduct13.jpg' AS `main_image`, 1 AS `status`, '2025-06-15 18:50:40' AS `created_at`, '2025-06-15 18:50:40' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct13' AND `category_id`=2);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct14' AS `name`, 'Description for SampleProduct14' AS `description`, 1288.21 AS `price`, 1545.85 AS `market_price`, 1030.57 AS `cost_price`, 146 AS `stock`, 62 AS `sold_num`, 3 AS `category_id`, '/images/SampleProduct14.jpg' AS `main_image`, 1 AS `status`, '2025-06-12 05:17:09' AS `created_at`, '2025-06-12 05:17:09' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct14' AND `category_id`=3);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct15' AS `name`, 'Description for SampleProduct15' AS `description`, 789.94 AS `price`, 947.93 AS `market_price`, 631.95 AS `cost_price`, 173 AS `stock`, 142 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct15.jpg' AS `main_image`, 1 AS `status`, '2025-06-17 14:49:00' AS `created_at`, '2025-06-17 14:49:00' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct15' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct16' AS `name`, 'Description for SampleProduct16' AS `description`, 682.35 AS `price`, 818.82 AS `market_price`, 545.88 AS `cost_price`, 24 AS `stock`, 7 AS `sold_num`, 1 AS `category_id`, '/images/SampleProduct16.jpg' AS `main_image`, 1 AS `status`, '2025-06-20 12:58:23' AS `created_at`, '2025-06-20 12:58:23' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct16' AND `category_id`=1);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct17' AS `name`, 'Description for SampleProduct17' AS `description`, 665.13 AS `price`, 798.16 AS `market_price`, 532.1 AS `cost_price`, 78 AS `stock`, 8 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct17.jpg' AS `main_image`, 1 AS `status`, '2025-06-23 03:56:25' AS `created_at`, '2025-06-23 03:56:25' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct17' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct18' AS `name`, 'Description for SampleProduct18' AS `description`, 1888.67 AS `price`, 2266.4 AS `market_price`, 1510.94 AS `cost_price`, 193 AS `stock`, 80 AS `sold_num`, 4 AS `category_id`, '/images/SampleProduct18.jpg' AS `main_image`, 1 AS `status`, '2025-06-16 21:49:14' AS `created_at`, '2025-06-16 21:49:14' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct18' AND `category_id`=4);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct19' AS `name`, 'Description for SampleProduct19' AS `description`, 1023.5 AS `price`, 1228.2 AS `market_price`, 818.8 AS `cost_price`, 174 AS `stock`, 117 AS `sold_num`, 3 AS `category_id`, '/images/SampleProduct19.jpg' AS `main_image`, 1 AS `status`, '2025-06-07 10:18:13' AS `created_at`, '2025-06-07 10:18:13' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct19' AND `category_id`=3);

INSERT INTO `products` (`name`,`description`,`price`,`market_price`,`cost_price`,`stock`,`sold_num`,`category_id`,`main_image`,`status`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'SampleProduct20' AS `name`, 'Description for SampleProduct20' AS `description`, 322.28 AS `price`, 386.74 AS `market_price`, 257.82 AS `cost_price`, 200 AS `stock`, 143 AS `sold_num`, 5 AS `category_id`, '/images/SampleProduct20.jpg' AS `main_image`, 1 AS `status`, '2025-06-19 03:10:01' AS `created_at`, '2025-06-19 03:10:01' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `products` WHERE `name`='SampleProduct20' AND `category_id`=5);

INSERT INTO `shipping_address` (`user_id`,`receiver_name`,`receiver_phone`,`province`,`city`,`district`,`detail_address`,`is_default`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 1 AS `user_id`, 'User1' AS `receiver_name`, '0988320463' AS `receiver_phone`, 'Kaohsiung City' AS `province`, 'Kaohsiung City' AS `city`, 'District1' AS `district`, 'No.1, Main St' AS `detail_address`, 1 AS `is_default`, '2025-06-22 19:01:11' AS `created_at`, '2025-06-22 19:01:11' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `shipping_address` WHERE `user_id`=1 AND `detail_address`='No.1, Main St');

INSERT INTO `shipping_address` (`user_id`,`receiver_name`,`receiver_phone`,`province`,`city`,`district`,`detail_address`,`is_default`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 2 AS `user_id`, 'User2' AS `receiver_name`, '0939436733' AS `receiver_phone`, 'Kaohsiung City' AS `province`, 'Kaohsiung City' AS `city`, 'District2' AS `district`, 'No.2, Main St' AS `detail_address`, 1 AS `is_default`, '2025-06-09 18:52:41' AS `created_at`, '2025-06-09 18:52:41' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `shipping_address` WHERE `user_id`=2 AND `detail_address`='No.2, Main St');

INSERT INTO `shipping_address` (`user_id`,`receiver_name`,`receiver_phone`,`province`,`city`,`district`,`detail_address`,`is_default`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 3 AS `user_id`, 'User3' AS `receiver_name`, '0976238574' AS `receiver_phone`, 'New Taipei City' AS `province`, 'New Taipei City' AS `city`, 'District3' AS `district`, 'No.3, Main St' AS `detail_address`, 1 AS `is_default`, '2025-06-13 08:49:14' AS `created_at`, '2025-06-13 08:49:14' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `shipping_address` WHERE `user_id`=3 AND `detail_address`='No.3, Main St');

INSERT INTO `shipping_address` (`user_id`,`receiver_name`,`receiver_phone`,`province`,`city`,`district`,`detail_address`,`is_default`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 4 AS `user_id`, 'User4' AS `receiver_name`, '0916323852' AS `receiver_phone`, 'Taipei City' AS `province`, 'Taipei City' AS `city`, 'District4' AS `district`, 'No.4, Main St' AS `detail_address`, 1 AS `is_default`, '2025-06-19 08:16:30' AS `created_at`, '2025-06-19 08:16:30' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `shipping_address` WHERE `user_id`=4 AND `detail_address`='No.4, Main St');

INSERT INTO `shipping_address` (`user_id`,`receiver_name`,`receiver_phone`,`province`,`city`,`district`,`detail_address`,`is_default`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 5 AS `user_id`, 'User5' AS `receiver_name`, '0994214382' AS `receiver_phone`, 'Taipei City' AS `province`, 'Taipei City' AS `city`, 'District5' AS `district`, 'No.5, Main St' AS `detail_address`, 1 AS `is_default`, '2025-06-04 17:02:11' AS `created_at`, '2025-06-04 17:02:11' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `shipping_address` WHERE `user_id`=5 AND `detail_address`='No.5, Main St');

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 1 AS `user_id`, 6 AS `product_id`, 4 AS `quantity`, 1 AS `selected`, '2025-06-15 11:26:00' AS `created_at`, '2025-06-15 11:26:00' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=1 AND `product_id`=6);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 1 AS `user_id`, 3 AS `product_id`, 4 AS `quantity`, 1 AS `selected`, '2025-06-10 06:18:33' AS `created_at`, '2025-06-10 06:18:33' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=1 AND `product_id`=3);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 1 AS `user_id`, 20 AS `product_id`, 4 AS `quantity`, 1 AS `selected`, '2025-06-13 20:13:53' AS `created_at`, '2025-06-13 20:13:53' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=1 AND `product_id`=20);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 2 AS `user_id`, 9 AS `product_id`, 5 AS `quantity`, 1 AS `selected`, '2025-06-21 21:26:25' AS `created_at`, '2025-06-21 21:26:25' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=2 AND `product_id`=9);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 2 AS `user_id`, 1 AS `product_id`, 1 AS `quantity`, 1 AS `selected`, '2025-06-17 13:07:30' AS `created_at`, '2025-06-17 13:07:30' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=2 AND `product_id`=1);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 2 AS `user_id`, 18 AS `product_id`, 3 AS `quantity`, 1 AS `selected`, '2025-06-19 15:44:28' AS `created_at`, '2025-06-19 15:44:28' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=2 AND `product_id`=18);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 3 AS `user_id`, 11 AS `product_id`, 1 AS `quantity`, 1 AS `selected`, '2025-06-08 02:58:34' AS `created_at`, '2025-06-08 02:58:34' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=3 AND `product_id`=11);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 3 AS `user_id`, 14 AS `product_id`, 2 AS `quantity`, 1 AS `selected`, '2025-06-12 00:18:47' AS `created_at`, '2025-06-12 00:18:47' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=3 AND `product_id`=14);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 3 AS `user_id`, 1 AS `product_id`, 3 AS `quantity`, 1 AS `selected`, '2025-06-13 03:36:45' AS `created_at`, '2025-06-13 03:36:45' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=3 AND `product_id`=1);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 4 AS `user_id`, 6 AS `product_id`, 5 AS `quantity`, 1 AS `selected`, '2025-06-23 03:38:39' AS `created_at`, '2025-06-23 03:38:39' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=4 AND `product_id`=6);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 4 AS `user_id`, 4 AS `product_id`, 3 AS `quantity`, 1 AS `selected`, '2025-06-21 10:18:28' AS `created_at`, '2025-06-21 10:18:28' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=4 AND `product_id`=4);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 4 AS `user_id`, 17 AS `product_id`, 5 AS `quantity`, 1 AS `selected`, '2025-06-05 19:52:26' AS `created_at`, '2025-06-05 19:52:26' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=4 AND `product_id`=17);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 5 AS `user_id`, 5 AS `product_id`, 3 AS `quantity`, 1 AS `selected`, '2025-06-19 12:11:41' AS `created_at`, '2025-06-19 12:11:41' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=5 AND `product_id`=5);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 5 AS `user_id`, 6 AS `product_id`, 5 AS `quantity`, 1 AS `selected`, '2025-06-19 21:34:58' AS `created_at`, '2025-06-19 21:34:58' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=5 AND `product_id`=6);

INSERT INTO `cart` (`user_id`,`product_id`,`quantity`,`selected`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 5 AS `user_id`, 17 AS `product_id`, 1 AS `quantity`, 1 AS `selected`, '2025-06-15 12:54:37' AS `created_at`, '2025-06-15 12:54:37' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `cart` WHERE `user_id`=5 AND `product_id`=17);

INSERT INTO `orders` (`order_no`,`user_id`,`total_amount`,`payment_amount`,`shipping_fee`,`address_id`,`status`,`payment_time`,`shipping_time`,`complete_time`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'ORD2025062401' AS `order_no`,3 AS `user_id`,7883.51 AS `total_amount`,7873.51 AS `payment_amount`,10.0 AS `shipping_fee`,3 AS `address_id`,1 AS `status`,'2025-06-20 03:07:33' AS `payment_time`,NULL AS `shipping_time`,NULL AS `complete_time`,'2025-06-04 02:47:36' AS `created_at`,'2025-06-04 02:47:36' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `orders` WHERE `order_no`='ORD2025062401');

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062401') AS `order_id`,1 AS `product_id`,'SampleProduct1' AS `product_name`,'/images/SampleProduct1.jpg' AS `product_image`,268.14 AS `current_price`,2 AS `quantity`,536.28 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062401' AND oi.`product_id`=1);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062401') AS `order_id`,10 AS `product_id`,'SampleProduct10' AS `product_name`,'/images/SampleProduct10.jpg' AS `product_image`,516.93 AS `current_price`,1 AS `quantity`,516.93 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062401' AND oi.`product_id`=10);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062401') AS `order_id`,19 AS `product_id`,'SampleProduct19' AS `product_name`,'/images/SampleProduct19.jpg' AS `product_image`,1896.55 AS `current_price`,1 AS `quantity`,1896.55 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062401' AND oi.`product_id`=19);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062401') AS `order_id`,16 AS `product_id`,'SampleProduct16' AS `product_name`,'/images/SampleProduct16.jpg' AS `product_image`,1641.25 AS `current_price`,3 AS `quantity`,4923.75 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062401' AND oi.`product_id`=16);

INSERT INTO `payment` (`order_id`,`payment_no`,`payment_method`,`payment_amount`,`payment_status`,`payment_time`,`callback_content`,`created_at`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062401') AS `order_id`,'PAYORD2025062401' AS `payment_no`,2 AS `payment_method`,7873.51 AS `payment_amount`,1 AS `payment_status`,'2025-06-20 03:07:33' AS `payment_time`,'Callback for PAYORD2025062401' AS `callback_content`,'2025-06-04 02:47:36' AS `created_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `payment` p JOIN `orders` o ON p.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062401' AND p.`payment_no`='PAYORD2025062401');

INSERT INTO `orders` (`order_no`,`user_id`,`total_amount`,`payment_amount`,`shipping_fee`,`address_id`,`status`,`payment_time`,`shipping_time`,`complete_time`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'ORD2025062402' AS `order_no`,5 AS `user_id`,9038.41 AS `total_amount`,9028.41 AS `payment_amount`,10.0 AS `shipping_fee`,5 AS `address_id`,1 AS `status`,'2025-06-20 04:43:11' AS `payment_time`,NULL AS `shipping_time`,NULL AS `complete_time`,'2025-06-18 07:19:22' AS `created_at`,'2025-06-18 07:19:22' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `orders` WHERE `order_no`='ORD2025062402');

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062402') AS `order_id`,9 AS `product_id`,'SampleProduct9' AS `product_name`,'/images/SampleProduct9.jpg' AS `product_image`,1078.96 AS `current_price`,3 AS `quantity`,3236.88 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062402' AND oi.`product_id`=9);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062402') AS `order_id`,14 AS `product_id`,'SampleProduct14' AS `product_name`,'/images/SampleProduct14.jpg' AS `product_image`,1930.51 AS `current_price`,3 AS `quantity`,5791.53 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062402' AND oi.`product_id`=14);

INSERT INTO `payment` (`order_id`,`payment_no`,`payment_method`,`payment_amount`,`payment_status`,`payment_time`,`callback_content`,`created_at`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062402') AS `order_id`,'PAYORD2025062402' AS `payment_no`,2 AS `payment_method`,9028.41 AS `payment_amount`,1 AS `payment_status`,'2025-06-20 04:43:11' AS `payment_time`,'Callback for PAYORD2025062402' AS `callback_content`,'2025-06-18 07:19:22' AS `created_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `payment` p JOIN `orders` o ON p.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062402' AND p.`payment_no`='PAYORD2025062402');

INSERT INTO `orders` (`order_no`,`user_id`,`total_amount`,`payment_amount`,`shipping_fee`,`address_id`,`status`,`payment_time`,`shipping_time`,`complete_time`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'ORD2025062403' AS `order_no`,3 AS `user_id`,4697.76 AS `total_amount`,4687.76 AS `payment_amount`,10.0 AS `shipping_fee`,3 AS `address_id`,0 AS `status`,NULL AS `payment_time`,NULL AS `shipping_time`,NULL AS `complete_time`,'2025-06-06 13:22:05' AS `created_at`,'2025-06-06 13:22:05' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `orders` WHERE `order_no`='ORD2025062403');

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062403') AS `order_id`,17 AS `product_id`,'SampleProduct17' AS `product_name`,'/images/SampleProduct17.jpg' AS `product_image`,930.4 AS `current_price`,1 AS `quantity`,930.4 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062403' AND oi.`product_id`=17);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062403') AS `order_id`,8 AS `product_id`,'SampleProduct8' AS `product_name`,'/images/SampleProduct8.jpg' AS `product_image`,174.85 AS `current_price`,1 AS `quantity`,174.85 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062403' AND oi.`product_id`=8);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062403') AS `order_id`,19 AS `product_id`,'SampleProduct19' AS `product_name`,'/images/SampleProduct19.jpg' AS `product_image`,1130.15 AS `current_price`,3 AS `quantity`,3390.45 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062403' AND oi.`product_id`=19);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062403') AS `order_id`,8 AS `product_id`,'SampleProduct8' AS `product_name`,'/images/SampleProduct8.jpg' AS `product_image`,64.02 AS `current_price`,3 AS `quantity`,192.06 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062403' AND oi.`product_id`=8);

INSERT INTO `payment` (`order_id`,`payment_no`,`payment_method`,`payment_amount`,`payment_status`,`payment_time`,`callback_content`,`created_at`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062403') AS `order_id`,'PAYORD2025062403' AS `payment_no`,1 AS `payment_method`,4687.76 AS `payment_amount`,0 AS `payment_status`,NULL AS `payment_time`,'Callback for PAYORD2025062403' AS `callback_content`,'2025-06-06 13:22:05' AS `created_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `payment` p JOIN `orders` o ON p.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062403' AND p.`payment_no`='PAYORD2025062403');

INSERT INTO `orders` (`order_no`,`user_id`,`total_amount`,`payment_amount`,`shipping_fee`,`address_id`,`status`,`payment_time`,`shipping_time`,`complete_time`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'ORD2025062404' AS `order_no`,1 AS `user_id`,3756.57 AS `total_amount`,3746.57 AS `payment_amount`,10.0 AS `shipping_fee`,1 AS `address_id`,3 AS `status`,'2025-06-23 01:40:59' AS `payment_time`,'2025-06-21 18:07:52' AS `shipping_time`,'2025-06-21 04:08:16' AS `complete_time`,'2025-06-20 14:24:03' AS `created_at`,'2025-06-21 04:08:16' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `orders` WHERE `order_no`='ORD2025062404');

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062404') AS `order_id`,3 AS `product_id`,'SampleProduct3' AS `product_name`,'/images/SampleProduct3.jpg' AS `product_image`,1052.6 AS `current_price`,2 AS `quantity`,2105.2 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062404' AND oi.`product_id`=3);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062404') AS `order_id`,16 AS `product_id`,'SampleProduct16' AS `product_name`,'/images/SampleProduct16.jpg' AS `product_image`,467.76 AS `current_price`,1 AS `quantity`,467.76 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062404' AND oi.`product_id`=16);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062404') AS `order_id`,19 AS `product_id`,'SampleProduct19' AS `product_name`,'/images/SampleProduct19.jpg' AS `product_image`,1173.61 AS `current_price`,1 AS `quantity`,1173.61 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062404' AND oi.`product_id`=19);

INSERT INTO `payment` (`order_id`,`payment_no`,`payment_method`,`payment_amount`,`payment_status`,`payment_time`,`callback_content`,`created_at`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062404') AS `order_id`,'PAYORD2025062404' AS `payment_no`,1 AS `payment_method`,3746.57 AS `payment_amount`,1 AS `payment_status`,'2025-06-23 01:40:59' AS `payment_time`,'Callback for PAYORD2025062404' AS `callback_content`,'2025-06-20 14:24:03' AS `created_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `payment` p JOIN `orders` o ON p.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062404' AND p.`payment_no`='PAYORD2025062404');

INSERT INTO `orders` (`order_no`,`user_id`,`total_amount`,`payment_amount`,`shipping_fee`,`address_id`,`status`,`payment_time`,`shipping_time`,`complete_time`,`created_at`,`updated_at`)
SELECT * FROM (SELECT 'ORD2025062405' AS `order_no`,4 AS `user_id`,7158.7 AS `total_amount`,7148.7 AS `payment_amount`,10.0 AS `shipping_fee`,4 AS `address_id`,2 AS `status`,'2025-06-21 02:17:32' AS `payment_time`,'2025-06-21 22:35:31' AS `shipping_time`,NULL AS `complete_time`,'2025-06-20 10:22:44' AS `created_at`,'2025-06-20 10:22:44' AS `updated_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `orders` WHERE `order_no`='ORD2025062405');

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062405') AS `order_id`,14 AS `product_id`,'SampleProduct14' AS `product_name`,'/images/SampleProduct14.jpg' AS `product_image`,851.65 AS `current_price`,3 AS `quantity`,2554.95 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062405' AND oi.`product_id`=14);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062405') AS `order_id`,2 AS `product_id`,'SampleProduct2' AS `product_name`,'/images/SampleProduct2.jpg' AS `product_image`,1363.06 AS `current_price`,3 AS `quantity`,4089.18 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062405' AND oi.`product_id`=2);

INSERT INTO `order_items` (`order_id`,`product_id`,`product_name`,`product_image`,`current_price`,`quantity`,`total_price`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062405') AS `order_id`,4 AS `product_id`,'SampleProduct4' AS `product_name`,'/images/SampleProduct4.jpg' AS `product_image`,168.19 AS `current_price`,3 AS `quantity`,504.57 AS `total_price`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `order_items` oi JOIN `orders` o ON oi.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062405' AND oi.`product_id`=4);

INSERT INTO `payment` (`order_id`,`payment_no`,`payment_method`,`payment_amount`,`payment_status`,`payment_time`,`callback_content`,`created_at`)
SELECT * FROM (SELECT (SELECT `order_id` FROM `orders` WHERE `order_no`='ORD2025062405') AS `order_id`,'PAYORD2025062405' AS `payment_no`,1 AS `payment_method`,7148.7 AS `payment_amount`,1 AS `payment_status`,'2025-06-21 02:17:32' AS `payment_time`,'Callback for PAYORD2025062405' AS `callback_content`,'2025-06-20 10:22:44' AS `created_at`) AS tmp
WHERE NOT EXISTS(SELECT 1 FROM `payment` p JOIN `orders` o ON p.`order_id`=o.`order_id` WHERE o.`order_no`='ORD2025062405' AND p.`payment_no`='PAYORD2025062405');

接下来在开始和结束中间加入LLM,同时开始加入一个变量表示用户输入,结束加入一个标量表示模型的输出。在大模型节点添加提示词

你是一名精通 MySQL 8.0 的电商数据库专家。
给定中文自然语言问题,只输出 一条 正确且高效的 SQL 语句,除此之外不输出任何内容(无需解释或代码块)。


1 输出格式
仅输出 SQL 文本,以分号结尾。
使用换行与缩进提高可读性。


2 数据库模式(含推荐别名 & 每个字段的中文释义)
2.1 users 表 别名:u
字段说明
user_id (PK)
用户主键,自增
username
用户名,唯一
password
登录密码(加密存储)
email
邮箱地址,唯一
phone
手机号
avatar
头像 URL
status
状态:0 禁用,1 正常
created_at
创建时间
updated_at
更新时间(自动更新)
2.2 categories 表 别名:c
字段说明
category_id (PK)
分类主键,自增
name
分类名称
parent_id
父级分类 ID(自关联)
level
分类层级(1=顶级)
sort_order
排序权重
is_show
是否展示:0 隐藏,1 展示
2.3 products 表 别名:p
字段说明
product_id (PK)
商品主键,自增
name
商品名称
description
商品描述
price
销售价
market_price
市场价
cost_price
成本价
stock
库存数量
sold_num
已售数量
category_id
所属分类 ID
main_image
主图 URL
status
上架状态:0 下架,1 上架
created_at
创建时间
updated_at
更新时间
2.4 cart 表 别名:t
字段说明
cart_id (PK)
购物车主键,自增
user_id
用户 ID
product_id
商品 ID
quantity
数量
selected
是否勾选:0 否,1 是
created_at
创建时间
updated_at
更新时间
2.5 orders 表 别名:o
字段说明
order_id (PK)
订单主键,自增
order_no
订单号,唯一
user_id
用户 ID
total_amount
订单总金额(含运费)
payment_amount
实付金额
shipping_fee
运费
address_id
收货地址 ID
status
订单状态:0 待支付,1 已支付,2 已发货,3 已完成,4 已取消
payment_time
付款时间
shipping_time
发货时间
complete_time
完成时间
created_at
创建时间
updated_at
更新时间
2.6 order_items 表 别名:oi
字段说明
item_id (PK)
明细主键,自增
order_id
订单 ID
product_id
商品 ID
product_name
下单时商品名称
product_image
下单时商品图片
current_price
下单时单价
quantity
数量
total_price
小计金额
2.7 shipping_address 表 别名:sa
字段说明
address_id (PK)
地址主键,自增
user_id
用户 ID
receiver_name
收件人姓名
receiver_phone
收件人电话
province
省份
city
城市
district
区/县
detail_address
详细地址
is_default
是否默认:0 否,1 是
created_at
创建时间
updated_at
更新时间
2.8 payment 表 别名:pm
字段说明
payment_id (PK)
支付主键,自增
order_id
订单 ID
payment_no
支付流水号
payment_method
支付方式:1 支付宝,2 微信,3 银联
payment_amount
支付金额
payment_status
支付状态:0 未支付,1 成功,2 失败
payment_time
支付时间
callback_content
支付回调内容
created_at
创建时间


3 必须遵守的 SQL 规则
所有关联使用显式 JOIN,避免可用 JOIN 替代的子查询。
禁用 SELECT *,仅列出所需字段。
用 COALESCE 替代 IFNULL。
状态条件使用上表中的数字编码。
时间常量格式:'YYYY-MM-DD HH:MM:SS'。
分页使用 LIMIT … OFFSET …。
如对复杂查询有明显性能收益,可在语句前添加索引建议注释,例如:
/* 索引建议: CREATE INDEX idx_orders_user_status ON orders (user_id, status); */
无明显收益则省略。


4 性能与可读性
多步骤逻辑可用 CTE (WITH) 提升可读性。
避免重复计算。
默认使用 INNER JOIN,除非业务上需要 LEFT JOIN。


用户问题: {替换成自己的变量}
任务: 严格遵循上述规范,输出唯一一条最优 SQL 语句。

在这里插入图片描述
进行简单的测试
在这里插入图片描述
在这里插入图片描述
去数据库看看结果
在这里插入图片描述
看上去结果还行

进行知识库管理表结构

怎么解决上下文的问题(一万张表一万个表结构)?逐个击破,我们可以用知识库管理表结构。当然我生成数据的方法也是分而治之最后再让模型汇总。
点击知识库把刚才的表结构当成知识添加进去
在这里插入图片描述
随便新建个记事本添加以下内容


-- 用户表
CREATE TABLE IF NOT EXISTS `users` (
  `user_id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(50) NOT NULL UNIQUE,
  `password` VARCHAR(255) NOT NULL,
  `email` VARCHAR(100) NOT NULL UNIQUE,
  `phone` VARCHAR(20),
  `avatar` VARCHAR(255),
  `status` TINYINT DEFAULT 1 COMMENT '0-禁用 1-正常',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品分类表
CREATE TABLE IF NOT EXISTS `categories` (
  `category_id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(100) NOT NULL,
  `parent_id` INT DEFAULT NULL,
  `level` TINYINT DEFAULT 1 COMMENT '分类层级',
  `sort_order` INT DEFAULT 0,
  `is_show` TINYINT DEFAULT 1,
  FOREIGN KEY (`parent_id`) REFERENCES `categories` (`category_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 商品表
CREATE TABLE IF NOT EXISTS `products` (
  `product_id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(200) NOT NULL,
  `description` TEXT,
  `price` DECIMAL(10,2) NOT NULL,
  `market_price` DECIMAL(10,2),
  `cost_price` DECIMAL(10,2),
  `stock` INT NOT NULL DEFAULT 0,
  `sold_num` INT DEFAULT 0,
  `category_id` INT,
  `main_image` VARCHAR(255),
  `status` TINYINT DEFAULT 1 COMMENT '0-下架 1-上架',
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`category_id`) REFERENCES `categories` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 购物车表
CREATE TABLE IF NOT EXISTS `cart` (
  `cart_id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `product_id` INT NOT NULL,
  `quantity` INT NOT NULL DEFAULT 1,
  `selected` TINYINT DEFAULT 1,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`),
  FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单表
CREATE TABLE IF NOT EXISTS `orders` (
  `order_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_no` VARCHAR(50) NOT NULL UNIQUE,
  `user_id` INT NOT NULL,
  `total_amount` DECIMAL(10,2) NOT NULL,
  `payment_amount` DECIMAL(10,2) NOT NULL,
  `shipping_fee` DECIMAL(10,2) DEFAULT 0,
  `address_id` INT,
  `status` TINYINT DEFAULT 0 COMMENT '0-待支付 1-已支付 2-已发货 3-已完成 4-已取消',
  `payment_time` DATETIME,
  `shipping_time` DATETIME,
  `complete_time` DATETIME,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 订单明细表
CREATE TABLE IF NOT EXISTS `order_items` (
  `item_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_id` INT NOT NULL,
  `product_id` INT NOT NULL,
  `product_name` VARCHAR(200) NOT NULL,
  `product_image` VARCHAR(255),
  `current_price` DECIMAL(10,2) NOT NULL,
  `quantity` INT NOT NULL,
  `total_price` DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`),
  FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 收货地址表
CREATE TABLE IF NOT EXISTS `shipping_address` (
  `address_id` INT AUTO_INCREMENT PRIMARY KEY,
  `user_id` INT NOT NULL,
  `receiver_name` VARCHAR(50) NOT NULL,
  `receiver_phone` VARCHAR(20) NOT NULL,
  `province` VARCHAR(50) NOT NULL,
  `city` VARCHAR(50) NOT NULL,
  `district` VARCHAR(50) NOT NULL,
  `detail_address` VARCHAR(255) NOT NULL,
  `is_default` TINYINT DEFAULT 0,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  `updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 支付记录表
CREATE TABLE IF NOT EXISTS `payment` (
  `payment_id` INT AUTO_INCREMENT PRIMARY KEY,
  `order_id` INT NOT NULL,
  `payment_no` VARCHAR(100) NOT NULL,
  `payment_method` TINYINT COMMENT '1-支付宝 2-微信 3-银联',
  `payment_amount` DECIMAL(10,2) NOT NULL,
  `payment_status` TINYINT DEFAULT 0 COMMENT '0-未支付 1-支付成功 2-支付失败',
  `payment_time` DATETIME,
  `callback_content` TEXT,
  `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (`order_id`) REFERENCES `orders` (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

然后知识库中上传该文档(全部默认即可)
接下去在工作流中继续添加知识检索的节点,把选择刚才上传的文档,重点是LLM层的设置。
在这里插入图片描述
发现生成的还可以
在这里插入图片描述
那么怎么执行呢?启动这个python文件,同时注意修改你的数据库信息以及端口号

from fastapi import FastAPI, HTTPException, Depends, Body
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import PlainTextResponse
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker, Session
import logging

# 基础配置
DB_CONFIG = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "root",
    "password": "root",
    "database": "电商数据库模拟"
}

app = FastAPI()

# —— CORS 配置 ——
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 数据库连接
SQLALCHEMY_DATABASE_URL = (
    f"mysql+pymysql://{DB_CONFIG['user']}:{DB_CONFIG['password']}"
    f"@{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}"
)
engine = create_engine(SQLALCHEMY_DATABASE_URL, pool_pre_ping=True)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post(
    "/execute/",
    response_class=PlainTextResponse,      # ← 返回纯文本
)
async def execute_sql(
    sql: str = Body(..., embed=True, description="要执行的 SQL 语句"),
    params: dict = Body(None, embed=True, description="SQL 参数,可选"),
    db: Session = Depends(get_db)
):
    """
    请求体示例:
    {
      "sql": "SELECT COUNT(*) FROM categories;",
      "params": {}
    }
    返回的是一段纯文本字符串。
    """
    try:
        logger.info(f"Executing SQL: {sql}")
        result = db.execute(text(sql), params or {})

        # 如果是查询,就把每行拼成逗号分隔、行与行用换行隔开
        if sql.strip().lower().startswith("select"):
            rows = result.fetchall()
            # 把结果转成字符串,比如:
            # 1,2,3
            # 4,5,6
            text_rows = []
            for row in rows:
                # 保证每个字段转成 str,再 join
                text_rows.append(",".join(str(item) for item in row))
            return "\n".join(text_rows)

        # 非查询语句,直接返回受影响行数
        db.commit()
        return f"Execution successful, rows affected: {result.rowcount}"

    except Exception as e:
        db.rollback()
        logger.error(f"Execution failed: {e}")
        # 抛出 HTTPException 时,FastAPI 也会用 PlainTextResponse
        raise HTTPException(status_code=400, detail=str(e))


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=3326)

然后在代码执行哪里修改为

import requests
import re

def clean_sql(sql: str) -> str:
    """
    去除字符串中 markdown 风格的 SQL 代码块标记:
    ```sql
    SELECT ...
    ```
    或者 ```... ```
    """
    # 用正则提取 ```…```里面的内容
    fence_pattern = re.compile(r"```(?:sql)?\n([\s\S]*?)```", re.IGNORECASE)
    match = fence_pattern.search(sql)
    if match:
        # 如果匹配到,就只保留代码块内部
        sql = match.group(1)
    # 最后再去掉前后多余的空白
    return sql.strip()

def main(sql):
    try:
        # 先清洗一遍
        cleaned_sql = clean_sql(sql)

        response = requests.post(
            "http://192.168.1.87:3326/execute/",
            json={"sql": cleaned_sql}
        )
        response.raise_for_status()  # 自动触发 HTTP 错误

        return {
            "result": response.text,  # 这里拿到的就是纯文本,比如 "8"
        }
    except requests.exceptions.RequestException as e:
        return {
            "result": "error: " + str(e),
        }

然后你可以开始测试了。

个性化定制

说明

个性化定制需要重启服务或者进行以下操作:

docker-compose down
docker-compose up -d

重启或者进行上面的命令前请做好数据备份,造成数据丢失后果自负。

标准定制

容器组名字

在.env的第一行写上COMPOSE_PROJECT_NAME=你要改的名字,比如我是dify

COMPOSE_PROJECT_NAME=dify

管理员密码修改

注意这里登陆的时候邮箱+密码,界面不会又太大的变化。
在.env中将INIT_PASSWORD的值写成你的,比如我修改的是123456

INIT_PASSWORD=123456

上传下载文件定制

文件存储的映射地址修改(有两处,用ctrl+f搜一下)

docker-compose.yaml(下文简称为yaml)中找到

    volumes:
      # Mount the storage directory to the container, for storing user files.
      - ./volumes/app/storage:/app/api/storage
  • ./volumes/app/storage修改为你想映射的本地路径。比如我想映射到E:\work\docker_data\dify\store,那就修改后的代码就是:
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - E:\work\docker_data\dify\store:/app/api/storage
文件存储的映射端口修改

.env中修改FILES_URL=http://localhost:你的端口号但这里的端口和下面的yaml中的端口号要一致
刚才的yaml中的volumes的上面添加

ports:
- "你的端口:5001"

完整的可以参考

services:
  # API service
  api:
    image: langgenius/dify-api:1.4.1
    restart: always
    ports:
      - 5001:5001
    environment:
      # Use the shared environment variables.
      <<: *shared-api-worker-env
      # Startup mode, 'api' starts the API server.
      MODE: api
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}
      PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}
      PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - E:/work/docker_data/dify/app/api/storage:/app/api/storage
    networks:
      - ssrf_proxy_network
      - default

  # worker service
  # The Celery worker for processing the queue.
  worker:
    image: langgenius/dify-api:1.4.1
    restart: always
    environment:
      # Use the shared environment variables.
      <<: *shared-api-worker-env
      # Startup mode, 'worker' starts the Celery worker for processing the queue.
      MODE: worker
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - E:/work/docker_data/dify/app/api/storage:/app/api/storage
    networks:
      - ssrf_proxy_network
      - default

日志定制

原参数解释

# 应用的日志级别。
# 支持的取值:`DEBUG`、`INFO`、`WARNING`、`ERROR`、`CRITICAL`。
# 比如设为 INFO 时只会输出 INFO 及以上级别的日志,DEBUG 级别的调试信息则不会被记录。
LOG_LEVEL=INFO
# 日志文件的存放路径
LOG_FILE=/app/logs/server.log
# 日志文件允许的最大大小(单位:MB)
LOG_FILE_MAX_SIZE=20
# 日志文件的最大备份数量(达到该数量后最旧的备份会被删除)
LOG_FILE_BACKUP_COUNT=5
# 日志中时间的格式
LOG_DATEFORMAT=%Y-%m-%d %H:%M:%S
# 日志记录使用的时区,比如我这里修改成了上海
LOG_TZ=Asia/Shanghai

如果想修改到本地映射的日志地址,找到

services:
  # API service
  api:
    image: langgenius/dify-api:1.4.1
    restart: always
    ports:
      - 5001:5001
    environment:
      # Use the shared environment variables.
      <<: *shared-api-worker-env
      # Startup mode, 'api' starts the API server.
      MODE: api
      SENTRY_DSN: ${API_SENTRY_DSN:-}
      SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}
      SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}
      PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}
      PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}
      PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}
      INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      # Mount the storage directory to the container, for storing user files.
      - E:/work/docker_data/dify/app/api/storage:/app/api/storage
    networks:
      - ssrf_proxy_network
      - default

然后在volumes增加(注意api和下面的work都要修改)

- "你要设置的本地映射文件地址:/app/api/storage"

openai接口调用修改

在.env中找到OPENAI_API_BASE=兼容openai接口的地址(国内大多数厂商都做了接口适配,也可以用ollama、vllm等包一层)

OPENAI_API_BASE=接口地址

API 服务监听地址

在.env中找到DIFY_BIND_ADDRESS=0.0.0.0,他的默认是全网络监听,你可以修改成个别的IP可以访问。

网络搜索相关配置

ENABLE_WEBSITE_JINAREADER=true
启用 Jina Reader 插件——Dify 用它来抓取并解析网页内容,例如 HTML 文档、文章、博客等,方便把网页上的文本导入到知识库里。
ENABLE_WEBSITE_FIRECRAWL=true
启用 Firecrawl 插件——这是另一个爬虫模块,侧重于快速、高并发地抓取目标网页内容,适合抓取大量页面或对外部网页进行大规模采集。
ENABLE_WEBSITE_WATERCRAWL=true
启用 Watercrawl 插件——通常用于处理一些对反爬虫保护更严格的网站,它会模拟更接近真实用户行为的抓取策略,以提高抓取成功率。

数据库定制(以PostgreSQL为例)

PostgreSQL(关系型数据库)

连接信息
DB_USERNAME / DB_PASSWORD:数据库用户名和密码。
DB_HOST / DB_PORT:数据库所在主机名(或 IP)和端口,Compose 里通常是服务名 db:5432。
DB_DATABASE:要连接的数据库名称(这里是 dify)。
SQLAlchemy 连接池
Dify 在后台用 SQLAlchemy 管理数据库连接,下面几项控制连接池的行为:
SQLALCHEMY_POOL_SIZE:最大同时打开多少个连接,默认 30。
SQLALCHEMY_POOL_RECYCLE:连接在池里最大闲置多久(秒)后会被回收并重建,防止数据库断开老连接。SQLALCHEMY_POOL_RECYCLE=0则不会触发回收机制。
SQLALCHEMY_ECHO:如果设为 true,会把所有执行的 SQL 语句打印到日志,便于调试,生产环境一般设 false。
PostgreSQL 服务端调优
这些变量会在 PostgreSQL 启动命令里被传给 postgres -c …,用来微调数据库的性能:
POSTGRES_MAX_CONNECTIONS:允许同时连接到数据库的客户端数量上限。
POSTGRES_SHARED_BUFFERS:Postgres 用于缓存表数据的共享内存大小,推荐设成系统 RAM 的 25%。
POSTGRES_WORK_MEM:每个排序或哈希操作可用的内存上限,太小会导致频繁磁盘写入,太大会吃光内存。
POSTGRES_MAINTENANCE_WORK_MEM:用于 VACUUM、CREATE INDEX 等维护任务的内存量。
POSTGRES_EFFECTIVE_CACHE_SIZE:告诉查询规划器操作系统层面大约有多少缓存可用,用于更好地估算索引成本。

使用自己的PostgreSQL

  1. 在数据库运行
    CREATE DATABASE dify;
  2. 在.env中进行修改
DB_USERNAME=myuser
DB_PASSWORD=mypassword
DB_HOST=IP地址
DB_PORT=5432
DB_DATABASE=dify

注意:docker部署的postgresql,那么host哪里要写容器名,并在docker compose以后运行

docker network connect dify_default psql(你的psql的容器名字)

同时也要修改下面的信息

PGUSER=${DB_USERNAME}
POSTGRES_PASSWORD=${DB_PASSWORD}
POSTGRES_DB=${DB_DATABASE}

3.修改yaml
删除

  db:
    image: postgres:17.4
    restart: always
    environment:
      PGUSER: ${PGUSER:-postgres}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-difyai123456}
      POSTGRES_DB: ${POSTGRES_DB:-dify}
      PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata}
    command: >
      postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}'
               -c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}'
               -c 'work_mem=${POSTGRES_WORK_MEM:-4MB}'
               -c 'maintenance_work_mem=${POSTGRES_MAINTENANCE_WORK_MEM:-64MB}'
               -c 'effective_cache_size=${POSTGRES_EFFECTIVE_CACHE_SIZE:-4096MB}'
    volumes:
      - ./volumes/db/data:/var/lib/postgresql/data
    healthcheck:
      test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]
      interval: 1s
      timeout: 3s
      retries: 60

找到(api、worker和plugin_daemon都要删除)

    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

删除

      db:
        condition: service_healthy

找到

  nginx:
    image: nginx:latest
    restart: always
    volumes:
      - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template
      - ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template
      - ./nginx/https.conf.template:/etc/nginx/https.conf.template
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh
      - ./nginx/ssl:/etc/ssl # cert dir (legacy)
      - ./volumes/certbot/conf/live:/etc/letsencrypt/live # cert dir (with certbot container)
      - ./volumes/certbot/conf:/etc/letsencrypt
      - ./volumes/certbot/www:/var/www/html
    entrypoint: [ 'sh', '-c', "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh" ]
    environment:
      NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}
      NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}
      NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}
      NGINX_PORT: ${NGINX_PORT:-80}
      NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt}
      NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key}
      NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3}
      NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto}
      NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M}
      NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65}
      NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s}
      NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s}
      NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false}
      CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-}
    depends_on:
      - api
      - web
    ports:
      - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
      - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
    # ← 注意:这里原本没有 networks:,nginx 没加入 default 网络,就无法通过 api:5001 找到 api 容器

替换为

  nginx:
    image: nginx:latest
    restart: always
    volumes:
      - ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template
      - ./nginx/proxy.conf.template:/etc/nginx/proxy.conf.template
      - ./nginx/https.conf.template:/etc/nginx/https.conf.template
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/docker-entrypoint.sh:/docker-entrypoint-mount.sh
      - ./nginx/ssl:/etc/ssl                          # cert dir (legacy)
      - ./volumes/certbot/conf/live:/etc/letsencrypt/live  # cert dir (with certbot container)
      - ./volumes/certbot/conf:/etc/letsencrypt
      - ./volumes/certbot/www:/var/www/html
    entrypoint:
      - 'sh'
      - '-c'
      - "cp /docker-entrypoint-mount.sh /docker-entrypoint.sh && sed -i 's/\\r$$//' /docker-entrypoint.sh && chmod +x /docker-entrypoint.sh && /docker-entrypoint.sh"
    environment:
      NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}
      NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}
      NGINX_SSL_PORT: ${NGINX_SSL_PORT:-443}
      NGINX_PORT: ${NGINX_PORT:-80}
      NGINX_SSL_CERT_FILENAME: ${NGINX_SSL_CERT_FILENAME:-dify.crt}
      NGINX_SSL_CERT_KEY_FILENAME: ${NGINX_SSL_CERT_KEY_FILENAME:-dify.key}
      NGINX_SSL_PROTOCOLS: ${NGINX_SSL_PROTOCOLS:-TLSv1.1 TLSv1.2 TLSv1.3}
      NGINX_WORKER_PROCESSES: ${NGINX_WORKER_PROCESSES:-auto}
      NGINX_CLIENT_MAX_BODY_SIZE: ${NGINX_CLIENT_MAX_BODY_SIZE:-15M}
      NGINX_KEEPALIVE_TIMEOUT: ${NGINX_KEEPALIVE_TIMEOUT:-65}
      NGINX_PROXY_READ_TIMEOUT: ${NGINX_PROXY_READ_TIMEOUT:-3600s}
      NGINX_PROXY_SEND_TIMEOUT: ${NGINX_PROXY_SEND_TIMEOUT:-3600s}
      NGINX_ENABLE_CERTBOT_CHALLENGE: ${NGINX_ENABLE_CERTBOT_CHALLENGE:-false}
      CERTBOT_DOMAIN: ${CERTBOT_DOMAIN:-}
    depends_on:
      - api
      - plugin_daemon    # ← 确保 plugin_daemon 先启动,否则 nginx proxy /plugin/ 会找不到主机
      - redis            # ← 如果你还有 redis,它也会先等 redis 启动
      - web              # ← 如果你还需要 web,也可以加回来
    ports:
      - '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'
      - '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
    networks:
      - default         # ← 一定要加,让 nginx 到 default 网络里去解析 api:5001
      - ssrf_proxy_network  # ← 如果你需要 nginx 也访问 ssrf_proxy、sandbox,就保留这一行

找到

    environment:
      # Use the shared environment variables.
      <<: *shared-api-worker-env
      DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}

增加数据库信息如:

environment:
      # Use the shared environment variables.
	 DB_HOST: ${DB_HOST}                 # 也可写死,如:192.168.1.100
	 DB_PORT: ${DB_PORT:-5432}           # 也可写死,如:5432
	 DB_USERNAME: ${DB_USERNAME}         # 也可写死,如:myuser
	 DB_PASSWORD: ${DB_PASSWORD}         # 也可写死,如:mypassword
	 # ---------------------------------------------------------
	 DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值