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
然后在提示词中加入变量
然后加入节点结束,点击右上角运行即可查看测试结果
然后点击发布即可
之后点击在探索中打开
然后依次点击下载模板,在模板中输入信息,即可再点击批量运行即可
简单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
- 在数据库运行
CREATE DATABASE dify; - 在.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}