Add query column data type

This commit is contained in:
SwallowGG
2023-09-19 16:32:07 +08:00
parent 7d696300c0
commit 9b86c4f113
9 changed files with 231 additions and 53 deletions

View File

@ -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);
}
}

View File

@ -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) ;

View File

@ -66,7 +66,7 @@ public class TableController {
return WebPageResult.of(tableVOS, tableDTOPageResult.getTotal(), request.getPageNo(), return WebPageResult.of(tableVOS, tableDTOPageResult.getTotal(), request.getPageNo(),
request.getPageSize()); request.getPageSize());
} }
/** /**
* 查询当前DB下的表columns * 查询当前DB下的表columns

View File

@ -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;
}

View File

@ -1,8 +1,5 @@
package ai.chat2db.server.web.api.controller.rdb.vo; 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.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@ -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);
}

View File

@ -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<String> {
/**
* BIGINT
*/
BIGINT,
/**
* VARCHAR
*/
VARCHAR,
/**
* TIMESTAMP
*/
TIMESTAMP,
/**
* DATETIME
*/
DATETIME,
/**
* INTEGER
*/
INTEGER,
;
@Override
public String getCode() {
return this.name();
}
@Override
public String getDescription() {
return this.name();
}
}

View File

@ -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;
}
}

View File

@ -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;
}