diff --git a/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java new file mode 100644 index 00000000..7e9370c9 --- /dev/null +++ b/chat2db-server/chat2db-plugins/chat2db-mysql/src/main/java/ai/chat2db/plugin/mysql/type/MysqlColumnTypeEnum.java @@ -0,0 +1,65 @@ +package ai.chat2db.plugin.mysql.type; + +import ai.chat2db.spi.model.ColumnType; + +public enum MysqlColumnTypeEnum { + + BIT("BIT", true, false, true, false, false, false, true, true, false), + + TINYINT("TINYINT", false, false, true, true, false, false, true, true, false), + + TINYINT_UNSIGNED("TINYINT UNSIGNED", false, false, true, true, false, false, true, true, false), + + SMALLINT("SMALLINT", false, false, true, true, false, false, true, true, false), + + SMALLINT_UNSIGNED("SMALLINT UNSIGNED", false, false, true, true, false, false, true, true, false), + + MEDIUMINT("MEDIUMINT", false, false, true, true, false, false, true, true, false), + + MEDIUMINT_UNSIGNED("MEDIUMINT UNSIGNED", false, false, true, true, false, false, true, true, false), + + INT("INT", false, false, true, true, false, false, true, true, false), + + + INT_UNSIGNED("INT UNSIGNED", false, false, true, true, false, false, true, true, false), + + BIGINT("BIGINT", false, false, true, true, false, false, true, true, false), + + + BIGINT_UNSIGNED("BIGINT UNSIGNED", false, false, true, true, false, false, true, true, false), + + + DECIMAL("DECIMAL", true, true, true, false, false, false, true, true, false), + + DECIMAL_UNSIGNED("DECIMAL UNSIGNED", true, true, true, false, false, false, true, true, false), + + + FLOAT("FLOAT", true, true, true, false, false, false, true, true, false), FLOAT_UNSIGNED("FLOAT UNSIGNED", true, true, true, false, false, false, true, true, false), + + DOUBLE("DOUBLE", true, true, true, false, false, false, true, true, false), + + DOUBLE_UNSIGNED("DOUBLE UNSIGNED", true, true, true, false, false, false, true, true, false), DATE("DATE", false, false, true, false, false, false, true, true, false), DATETIME("DATETIME", true, false, true, false, false, false, true, true, true), TIMESTAMP("TIMESTAMP", true, false, true, false, false, false, true, true, true), TIME("TIME", true, false, true, false, false, false, true, true, false), YEAR("YEAR", false, false, true, false, false, false, true, true, false), CHAR("CHAR", true, false, true, false, false, true, true, true, false), VARCHAR("VARCHAR", true, false, true, false, false, true, true, true, false), BINARY("BINARY", true, false, true, false, false, false, true, true, false), VARBINARY("VARBINARY", true, false, true, false, false, false, true, true, false), TINYBLOB("TINYBLOB", false, false, true, false, false, false, true, false, false), BLOB("BLOB", false, false, true, false, false, false, true, false, false), MEDIUMBLOB("MEDIUMBLOB", false, false, true, false, false, false, true, false, false), LONGBLOB("LONGBLOB", false, false, true, false, false, false, true, false, false), TINYTEXT("TINYTEXT", false, false, true, false, false, true, true, false, false), TEXT("TEXT", false, false, true, false, false, true, true, false, false), MEDIUMTEXT("MEDIUMTEXT", false, false, true, false, false, true, true, false, false), LONGTEXT("LONGTEXT", false, false, true, false, false, true, true, false, false), ENUM("ENUM", false, false, true, false, false, true, true, true, true), + + + BOOL("BOOL", false, false, true, true, false, false, true, true, false), + + INTEGER("INTEGER", false, false, true, true, false, false, true, true, false), INTEGER_UNSIGNED("INTEGER UNSIGNED", false, false, true, true, false, false, true, true, false), + + REAL("REAL", true, true, true, false, false, false, true, true, false), + + SET("SET", false, false, true, false, false, true, true, true, true), + + + GEOMETRY("GEOMETRY", false, false, true, false, false, false, true, false, false), POINT("POINT", false, false, true, false, false, false, true, false, false), LINESTRING("LINESTRING", false, false, true, false, false, false, true, false, false), POLYGON("POLYGON", false, false, true, false, false, false, true, false, false), MULTIPOINT("MULTIPOINT", false, false, true, false, false, false, true, false, false), MULTILINESTRING("MULTILINESTRING", false, false, true, false, false, false, true, false, false), MULTIPOLYGON("MULTIPOLYGON", false, false, true, false, false, false, true, false, false), GEOMETRYCOLLECTION("GEOMETRYCOLLECTION", false, false, true, false, false, false, true, false, false), + + JSON("JSON", false, false, true, false, false, false, true, false, false); + + private ColumnType columnType; + + + MysqlColumnTypeEnum(String dataTypeName, boolean supportLength, boolean supportScale, boolean supportNullable, boolean supportAutoIncrement, boolean supportCharset, boolean supportCollation, boolean supportComments, boolean supportDefaultValue, boolean supportExtent) { + this.columnType = new ColumnType(dataTypeName, supportLength, supportScale, supportNullable, supportAutoIncrement, supportCharset, supportCollation, supportComments, supportDefaultValue, supportExtent); + } + + +} diff --git a/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_3__TableCache.sql b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_3__TableCache.sql new file mode 100644 index 00000000..9e050433 --- /dev/null +++ b/chat2db-server/chat2db-server-start/src/main/resources/db/migration/V2_1_3__TableCache.sql @@ -0,0 +1,38 @@ +CREATE TABLE IF NOT EXISTS `table_cache_version` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `data_source_id` bigint(20) unsigned NOT NULL COMMENT '数据源连接ID', + `database_name` varchar(256) DEFAULT NULL COMMENT 'db名称', + `schema_name` varchar(256) DEFAULT NULL COMMENT 'schema名称', + `key` varchar(256) DEFAULT NULL COMMENT '唯一索引', + `version` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '版本', + `table_count` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '表数量', + `status` varchar(256) DEFAULT NULL COMMENT '状态', + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='table cache version' +; +create INDEX idx_data_source_id on table_cache_version(data_source_id) ; +create UNIQUE INDEX uk_key on table_cache_version(key) ; + +CREATE TABLE IF NOT EXISTS `table_cache` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', + `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `data_source_id` bigint(20) unsigned NOT NULL COMMENT '数据源连接ID', + `database_name` varchar(256) DEFAULT NULL COMMENT 'db名称', + `schema_name` varchar(256) DEFAULT NULL COMMENT 'schema名称', + `table_name` varchar(256) DEFAULT NULL COMMENT 'table名称', + `key` varchar(256) DEFAULT NULL COMMENT '唯一索引', + `version` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '版本', + `columns` varchar(2048) DEFAULT NULL COMMENT '表字段', + `extend_info` varchar(4096) NULL COMMENT '自定义扩展字段json'; + PRIMARY KEY (`id`) + ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='table cache' +; +create INDEX idx_data_source_id on table_cache(data_source_id) ; +create INDEX idx_key_version on table_cache(key,version) ; +create INDEX idx_key_table_name on table_cache(key,table_name) ; + + + diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java index 826d7ec0..83a091ed 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/TableController.java @@ -66,7 +66,7 @@ public class TableController { return WebPageResult.of(tableVOS, tableDTOPageResult.getTotal(), request.getPageNo(), request.getPageSize()); } - + /** * 查询当前DB下的表columns diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/NewTableSqlRequest.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/NewTableSqlRequest.java new file mode 100644 index 00000000..a2aeb6fc --- /dev/null +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/request/NewTableSqlRequest.java @@ -0,0 +1,16 @@ +package ai.chat2db.server.web.api.controller.rdb.request; + +import ai.chat2db.server.web.api.controller.data.source.request.DataSourceBaseRequest; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class NewTableSqlRequest extends DataSourceBaseRequest { + + /** + * 新的表结构 + */ + @NotNull + private TableRequest newTable; + +} diff --git a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/ColumnVO.java b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/ColumnVO.java index 0b12bc52..fecb2d06 100644 --- a/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/ColumnVO.java +++ b/chat2db-server/chat2db-server-web/chat2db-server-web-api/src/main/java/ai/chat2db/server/web/api/controller/rdb/vo/ColumnVO.java @@ -1,8 +1,5 @@ package ai.chat2db.server.web.api.controller.rdb.vo; -import ai.chat2db.spi.enums.ColumnTypeEnum; - -import com.fasterxml.jackson.annotation.JsonAlias; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java new file mode 100644 index 00000000..e34d0b1b --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/SqlBuilder.java @@ -0,0 +1,28 @@ +package ai.chat2db.spi; + +import ai.chat2db.spi.model.Table; + +public interface SqlBuilder { + + /** + * Generate create table sql + * + * @param databaseName + * @param schemaName + * @param table + * @return + */ + String generateCreateTableSql(String databaseName, String schemaName, Table table); + + + /** + * Generate modify table sql + * + * @param databaseName + * @param schemaName + * @param newTable + * @param oldTable + * @return + */ + String generateModifyTaleSql(String databaseName, String schemaName, Table newTable, Table oldTable); +} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/ColumnTypeEnum.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/ColumnTypeEnum.java deleted file mode 100644 index 9254e2f7..00000000 --- a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/enums/ColumnTypeEnum.java +++ /dev/null @@ -1,49 +0,0 @@ -package ai.chat2db.spi.enums; - -import ai.chat2db.server.tools.base.enums.BaseEnum; -import lombok.Getter; - -/** - * 列的类型 - * - * @author Jiaju Zhuang - */ -@Getter -public enum ColumnTypeEnum implements BaseEnum { - /** - * BIGINT - */ - BIGINT, - - /** - * VARCHAR - */ - VARCHAR, - - /** - * TIMESTAMP - */ - TIMESTAMP, - - /** - * DATETIME - */ - DATETIME, - - /** - * INTEGER - */ - INTEGER, - - ; - - @Override - public String getCode() { - return this.name(); - } - - @Override - public String getDescription() { - return this.name(); - } -} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java new file mode 100644 index 00000000..43e669fe --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/jdbc/DefaultSqlBuilder.java @@ -0,0 +1,63 @@ +package ai.chat2db.spi.jdbc; + +import ai.chat2db.spi.SqlBuilder; +import ai.chat2db.spi.model.Table; +import org.apache.commons.lang3.StringUtils; + +import java.util.Arrays; + +public class DefaultSqlBuilder implements SqlBuilder { + @Override + public String generateCreateTableSql(String databaseName, String schemaName, Table table) { + StringBuilder script = new StringBuilder(); + script.append("CREATE TABLE "); + script.append("`").append(table.getName()).append("`").append(" (").append("\n"); + for (ai.chat2db.spi.model.TableColumn column : table.getColumnList()) { + script.append("`").append(column.getName()).append("`").append(" "); + script.append(column.getDataType()).append(" "); + if (column.getColumnSize() != null) { + script.append("(").append(column.getColumnSize()).append(") "); + } +// if (column.getType().getDecimal() != null) { +// script.append("(").append(column.getType().getLength()).append(",").append(column.getType().getDecimal()).append(") "); +// } +// if (column.isNullable()) { +// script.append("NULL "); +// } else { +// script.append("NOT NULL "); +// } +// if (column.getDefaultValue() != null) { +// script.append("DEFAULT ").append(column.getDefaultValue()).append(" "); +// } +// if (column.getComment() != null) { +// script.append("COMMENT '").append(column.getComment()).append("' "); +// } + script.append(",").append("\n"); + } + return null; + } + + private String generateColumnSql(ai.chat2db.spi.model.TableColumn column) { + if(StringUtils.isEmpty(column.getColumnType())){ + return ""; + } + String type = column.getColumnType().toUpperCase(); + + StringBuilder script = new StringBuilder(); + script.append("`").append(column.getName()).append("`").append(" "); + script.append(type).append(" "); + if(Arrays.asList("","").contains(type)){ + script.append("(").append(column.getColumnSize()).append(") "); + } + + + + + return script.toString(); + } + + @Override + public String generateModifyTaleSql(String databaseName, String schemaName, Table newTable, Table oldTable) { + return null; + } +} diff --git a/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/ColumnType.java b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/ColumnType.java new file mode 100644 index 00000000..56b08f79 --- /dev/null +++ b/chat2db-server/chat2db-spi/src/main/java/ai/chat2db/spi/model/ColumnType.java @@ -0,0 +1,20 @@ +package ai.chat2db.spi.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ColumnType { + + private String dataTypeName; + private boolean supportLength; + private boolean supportScale; + private boolean supportNullable; + private boolean supportAutoIncrement; + private boolean supportCharset; + private boolean supportCollation; + private boolean supportComments; + private boolean supportDefaultValue; + private boolean supportExtent; +}