fix: 获取表主键逻辑完善

This commit is contained in:
meilin.huang
2022-11-23 20:48:37 +08:00
parent 3475c39fe6
commit 772995705f
4 changed files with 24 additions and 4 deletions

View File

@@ -566,7 +566,7 @@ const dump = (db: string) => {
const onShowRollbackSql = async (sqlExecLog: any) => {
const columns = await dbApi.columnMetadata.request({ id: sqlExecLog.dbId, db: sqlExecLog.db, tableName: sqlExecLog.table });
const primaryKey = columns[0].columnName;
const primaryKey = getPrimaryKey(columns);
const oldValue = JSON.parse(sqlExecLog.oldValue);
const rollbackSqls = [];
@@ -596,6 +596,14 @@ const onShowRollbackSql = async (sqlExecLog: any) => {
state.rollbackSqlDialog.visible = true;
};
const getPrimaryKey = (columns: any) => {
const col = columns.find((c: any) => c.columnKey == 'PRI');
if (col) {
return col.columnName;
}
return columns[0].columnName;
}
/**
* 包装值如果值类型为number则直接返回其他则需要使用''包装
*/

View File

@@ -14,7 +14,7 @@ type DbMetadata interface {
// 表名: tableName, 列名: columnName, 列类型: columnType, 备注: columnComment, 是否可为null: nullable, 其他信息: extra
GetColumns(tableNames ...string) []map[string]interface{}
// 获取表主键字段名,目前默认第一个字段
// 获取表主键字段名,没有主键标识则默认第一个字段
GetPrimaryKey(tablename string) string
// 获取表信息比GetTables获取更详细的表信息

View File

@@ -53,12 +53,18 @@ func (mm *MysqlMetadata) GetColumns(tableNames ...string) []map[string]interface
return result
}
// 获取表主键字段名,默认第一个字段
// 获取表主键字段名,不存在主键标识则默认第一个字段
func (mm *MysqlMetadata) GetPrimaryKey(tablename string) string {
columns := mm.GetColumns(tablename)
if len(columns) == 0 {
panic(biz.NewBizErr(fmt.Sprintf("[%s] 表不存在", tablename)))
}
for _, v := range columns {
if v["columnKey"].(string) == "PRI" {
return v["columnName"].(string)
}
}
return columns[0]["columnName"].(string)
}

View File

@@ -22,6 +22,7 @@ const (
A.attname AS "columnName",
tc.is_nullable AS "nullable",
concat_ws ( '', t.typname, SUBSTRING ( format_type ( a.atttypid, a.atttypmod ) FROM '\(.*\)' ) ) AS "columnType",
(CASE WHEN ( SELECT COUNT(*) FROM pg_constraint WHERE conrelid = a.attrelid AND conkey[1]= attnum AND contype = 'p' ) > 0 THEN 'PRI' ELSE '' END ) AS columnKey,
d.description AS "columnComment"
FROM
pg_attribute a LEFT JOIN pg_description d ON d.objoid = a.attrelid
@@ -65,12 +66,17 @@ func (pm *PgsqlMetadata) GetColumns(tableNames ...string) []map[string]interface
return result
}
// 获取表主键字段名,默认第一个字段
func (pm *PgsqlMetadata) GetPrimaryKey(tablename string) string {
columns := pm.GetColumns(tablename)
if len(columns) == 0 {
panic(biz.NewBizErr(fmt.Sprintf("[%s] 表不存在", tablename)))
}
for _, v := range columns {
if v["columnKey"].(string) == "PRI" {
return v["columnName"].(string)
}
}
return columns[0]["columnName"].(string)
}