支持保存顺序

This commit is contained in:
junleea 2025-08-20 22:28:36 +08:00
parent 96e1a96f2e
commit 29c05b0af7
2 changed files with 61 additions and 0 deletions

View File

@ -155,3 +155,58 @@ func FindAllSQLRunHistory() ([]proto.SQLRunHistory, error) {
} }
return histories, nil return histories, nil
} }
func RunSQLWithOrder(sql string, db_ *gorm.DB) (result proto.SQLResult, err error) {
var db2 *gorm.DB
// 保留 Debug 模式
if proto.Config.SERVER_SQL_LOG {
db2 = db_.Debug()
} else {
db2 = db_
}
// 执行 SQL 并获取底层 Rows 对象
rows, err := db2.Raw(sql).Rows()
if err != nil {
return result, err
}
defer rows.Close() // 确保关闭 Rows
// 获取列名顺序(关键:这里的顺序与 SQL 查询的列顺序一致)
columns, err := rows.Columns()
if err != nil {
return result, err
}
result.Columns = columns // 保存列名顺序
// 遍历每行数据
for rows.Next() {
// 准备接收每行数据的容器(按列顺序)
values := make([]interface{}, len(columns))
valuePtrs := make([]interface{}, len(columns)) // 用于 Scan 的指针切片
// 为每个列绑定指针Scan 要求传入指针)
for i := range values {
valuePtrs[i] = &values[i]
}
// 扫描当前行数据到指针切片
if err2 := rows.Scan(valuePtrs...); err2 != nil {
return result, err2
}
// 将当前行数据存入 map便于按列名访问
rowMap := make(map[string]interface{})
for i, col := range columns {
rowMap[col] = values[i]
}
result.Rows = append(result.Rows, rowMap)
}
// 检查遍历过程中是否有错误
if err = rows.Err(); err != nil {
return result, err
}
return result, nil
}

View File

@ -67,3 +67,9 @@ type GetSQLRunHistoryReq struct {
DB_ID uint `json:"db_id" form:"db_id"` // 数据库ID DB_ID uint `json:"db_id" form:"db_id"` // 数据库ID
GET_TYPE int `json:"get_type" form:"get_type"` // 获取类型: 0获取自己1为获取全部管理员权限 GET_TYPE int `json:"get_type" form:"get_type"` // 获取类型: 0获取自己1为获取全部管理员权限
} }
// SQLResult 包含查询结果的列名顺序和对应数据
type SQLResult struct {
Columns []string // 列名顺序(与 SQL 查询的列顺序一致)
Rows []map[string]interface{} // 每行数据map 便于按列名访问)
}