作为一名阿里巴巴开源项目的拥护者,从Chat2DB开源至今都有关注这个开源项目,因为之前的版本还存在较多BUG,暂时就没有分享,目前升级到 v1.0.11 版本后,我来谈谈我个人的一个使用感受
Chat2DB 是一款有开源免费的多数据库客户端工具,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极大的提升人员的效率,是AI时代数据库研发人员的利器,未来即使不懂SQL的运营业务也可以使用快速查询业务数据、生成报表能力。
项目Releases地址:
https://github.com/alibaba/Chat2DB/releases
大家根据自己的电脑环境选择对应版本即可,博主这里使用的MacOS X64 (Intel芯片)版本
正常双击打开拖动到Applications进行安装,安装完成后配置Chat2DB AI SQL功能,找到设置,填写Open Ai的密钥(登录OpenAi官网,右上角View API keys 创建即可),当然这里需要科学上网
创建完成后,在设置中输入刚刚获取的OpenAi密钥
至此一步我们已经完成了基础的配置,下面我们来感受一下Chat2DB
这里博主以mysql为例,点击加号新建数据源
填写相关链接信息 选择数据库,博主这里test为例
目前Mac版本选择了数据库test,但是实际上依旧还是将整个localhost的所有数据库列出来了,目前还是一个BUG,博主也在Issues建议官方不选择数据库默认所有,指定了数据库就单独显示某个库
这里博主准备了一份测试数据表,分别是:科目表、学生成绩表、学生信息表、学生选修科目表,大家可以复制执行即可
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '科目ID',
`name` varchar(50) NOT NULL COMMENT '科目名称',
`teacher` varchar(50) NOT NULL COMMENT '授课教师',
`credit` int NOT NULL COMMENT '科目学分',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='科目表';
-- ----------------------------
-- Records of course
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (1, '语文', '张老师', 100);
INSERT INTO `course` VALUES (2, '数学', '王老师', 100);
COMMIT;
-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '成绩ID',
`student_id` int NOT NULL COMMENT '学生ID',
`course_id` int NOT NULL COMMENT '科目ID',
`score` int NOT NULL COMMENT '成绩',
PRIMARY KEY (`id`),
KEY `student_id` (`student_id`),
KEY `course_id` (`course_id`),
CONSTRAINT `score_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
CONSTRAINT `score_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生成绩表';
-- ----------------------------
-- Records of score
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES (1, 1, 1, 90);
INSERT INTO `score` VALUES (2, 1, 2, 95);
INSERT INTO `score` VALUES (3, 2, 1, 100);
INSERT INTO `score` VALUES (4, 2, 2, 99);
COMMIT;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '学生ID',
`name` varchar(50) NOT NULL COMMENT '学生姓名',
`gender` varchar(10) NOT NULL COMMENT '学生性别',
`birthday` date NOT NULL COMMENT '学生生日',
`address` varchar(100) NOT NULL COMMENT '学生住址',
`phone` varchar(20) NOT NULL COMMENT '学生联系方式',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生信息表';
-- ----------------------------
-- Records of student
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (1, '小明', '男', '2023-06-16', '广州', '13724889158');
INSERT INTO `student` VALUES (2, '小羊', '女', '2023-06-16', '广州', '13800126000');
COMMIT;
-- ----------------------------
-- Table structure for student_course
-- ----------------------------
DROP TABLE IF EXISTS `student_course`;
CREATE TABLE `student_course` (
`id` int NOT NULL AUTO_INCREMENT COMMENT '关系ID',
`student_id` int NOT NULL COMMENT '学生ID',
`course_id` int NOT NULL COMMENT '科目ID',
PRIMARY KEY (`id`),
KEY `student_id` (`student_id`),
KEY `course_id` (`course_id`),
CONSTRAINT `student_course_ibfk_1` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`),
CONSTRAINT `student_course_ibfk_2` FOREIGN KEY (`course_id`) REFERENCES `course` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生选修科目表';
-- ----------------------------
-- Records of student_course
-- ----------------------------
BEGIN;
INSERT INTO `student_course` VALUES (1, 1, 1);
INSERT INTO `student_course` VALUES (2, 1, 2);
INSERT INTO `student_course` VALUES (3, 2, 1);
INSERT INTO `student_course` VALUES (4, 2, 2);
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
终端输入 ==查询学生小明的各科目成绩,包括科目名称、教师名字段 ==,点击自然语言转SQL
在弹出的选择表中选择本次查询所涉及到的几个表:course、score、student
最终生成如下:
那么我们使用这段生成的SQL反过来看看Chat2DB会帮我们解释成什么,选中生成的SQL点击SQL解释,输出如下:
--- BEGIN ---
SELECT course.name, course.teacher, score.score
FROM score
INNER JOIN course ON score.course_id = course.id
INNER JOIN student ON score.student_id = student.id
WHERE student.name = '小明'
--- 解释SQL ---
这个SQL查询语句的作用是从三个表中选择课程名称、教师和分数,其中分数是从score表中获取的。通过INNER JOIN将score表与course表和student表连接起来,连接条件是score表中的course_id等于course表中的id,同时score表中的student_id等于student表中的id。最后,通过WHERE子句筛选出学生名字为“小明”的记录。
--- END ---
我们依旧使用这段生成的SQL看看Chat2DB会给我们一些什么优化建议:
--- BEGIN ---
SELECT course.name, course.teacher, score.score
FROM score
INNER JOIN course ON score.course_id = course.id
INNER JOIN student ON score.student_id = student.id
WHERE student.name = '小明'
--- SQL优化 ---
优化建议:
1. 添加索引:在score表的course_id和student_id列上添加索引,以提高JOIN操作的效率。
2. 避免使用通配符:在WHERE子句中避免使用通配符,如使用LIKE '%小明%',会导致全表扫描,影响查询性能。
3. 使用EXISTS替代INNER JOIN:如果只需要查询小明的成绩,可以使用EXISTS子查询替代INNER JOIN,可以减少JOIN操作的次数,提高查询效率。
优化后的SQL语句如下:
SELECT course.name, course.teacher, score.score
FROM score
INNER JOIN course ON score.course_id = course.id
WHERE EXISTS (SELECT 1 FROM student WHERE student.id = score.student_id AND student.name = '小明')
--- END ---
通过上面的简单实用,相信大家已经知道Chat2DB的实用方法,其次再我们一些简单的命令下,它也能帮我们生成我们想要的语句,博主测试过一些复杂的业务SQL可能暂时还无法给到很正确提示,在SQL优化方面也给出了一定的建议,博主感觉这些建议都是可以供参考的,当然实际的情况还是需要根据我们的业务场景来决定
目前该开源项目还会提供支持环境隔离、支持团队协作,支持创建、修改、删除表,支持非关系型数据库的迭代版本,后续有新的功能版本,博主再来和大家分享,一下是项目的未来规划:
以上就是博主对阿里巴巴开源Chat2DB v1.0.11版本的体验感受,如果你觉得有用希望点赞关注,以免错失后续版本的分享~ 谢谢大家