mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 23:40:24 +08:00
refactor: sql解析失败逻辑重构
This commit is contained in:
@@ -3,10 +3,8 @@ package application
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"mayfly-go/internal/db/domain/entity"
|
"mayfly-go/internal/db/domain/entity"
|
||||||
"mayfly-go/internal/db/domain/repository"
|
"mayfly-go/internal/db/domain/repository"
|
||||||
"mayfly-go/pkg/global"
|
|
||||||
"mayfly-go/pkg/model"
|
"mayfly-go/pkg/model"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@@ -48,40 +46,44 @@ type dbSqlExecAppImpl struct {
|
|||||||
dbSqlExecRepo repository.DbSqlExec
|
dbSqlExecRepo repository.DbSqlExec
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *dbSqlExecAppImpl) Exec(execSqlReq *DbSqlExecReq) (*DbSqlExecRes, error) {
|
func createSqlExecRecord(execSqlReq *DbSqlExecReq) *entity.DbSqlExec {
|
||||||
sql := execSqlReq.Sql
|
|
||||||
loginAccount := execSqlReq.LoginAccount
|
|
||||||
|
|
||||||
// 如果是pgsql并且为查询语句,则直接返回,sqlparser不支持解析pgsql select语句
|
|
||||||
if execSqlReq.DbInstance.Type == entity.DbTypePostgres && (strings.HasPrefix(sql, "SELECT") || strings.HasPrefix(sql, "select")) {
|
|
||||||
return doSelect(nil, execSqlReq, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
stmt, err := sqlparser.Parse(sql)
|
|
||||||
if err != nil {
|
|
||||||
global.Log.Error("sql解析失败: ", err)
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
dbSqlExecRecord := new(entity.DbSqlExec)
|
dbSqlExecRecord := new(entity.DbSqlExec)
|
||||||
dbSqlExecRecord.DbId = execSqlReq.DbId
|
dbSqlExecRecord.DbId = execSqlReq.DbId
|
||||||
dbSqlExecRecord.Db = execSqlReq.Db
|
dbSqlExecRecord.Db = execSqlReq.Db
|
||||||
dbSqlExecRecord.Sql = sql
|
dbSqlExecRecord.Sql = execSqlReq.Sql
|
||||||
dbSqlExecRecord.Remark = execSqlReq.Remark
|
dbSqlExecRecord.Remark = execSqlReq.Remark
|
||||||
dbSqlExecRecord.SetBaseInfo(loginAccount)
|
dbSqlExecRecord.SetBaseInfo(execSqlReq.LoginAccount)
|
||||||
|
return dbSqlExecRecord
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dbSqlExecAppImpl) Exec(execSqlReq *DbSqlExecReq) (*DbSqlExecRes, error) {
|
||||||
|
sql := execSqlReq.Sql
|
||||||
|
stmt, err := sqlparser.Parse(sql)
|
||||||
|
if err != nil {
|
||||||
|
// 就算解析失败也执行sql,让数据库来判断错误
|
||||||
|
//global.Log.Error("sql解析失败: ", err)
|
||||||
|
if strings.HasPrefix(strings.ToLower(execSqlReq.Sql), "select") ||
|
||||||
|
strings.HasPrefix(strings.ToLower(execSqlReq.Sql), "show") {
|
||||||
|
return doSelect(execSqlReq)
|
||||||
|
}
|
||||||
|
// 保存执行记录
|
||||||
|
d.dbSqlExecRepo.Insert(createSqlExecRecord(execSqlReq))
|
||||||
|
return doExec(execSqlReq.Sql, execSqlReq.DbInstance)
|
||||||
|
}
|
||||||
|
|
||||||
|
dbSqlExecRecord := createSqlExecRecord(execSqlReq)
|
||||||
var execRes *DbSqlExecRes
|
var execRes *DbSqlExecRes
|
||||||
isSelect := false
|
isSelect := false
|
||||||
switch stmt := stmt.(type) {
|
switch stmt := stmt.(type) {
|
||||||
case *sqlparser.Select:
|
case *sqlparser.Select:
|
||||||
isSelect = true
|
isSelect = true
|
||||||
execRes, err = doSelect(stmt, execSqlReq, dbSqlExecRecord)
|
execRes, err = doSelect(execSqlReq)
|
||||||
case *sqlparser.Show:
|
case *sqlparser.Show:
|
||||||
isSelect = true
|
isSelect = true
|
||||||
execRes, err = doSelect(nil, execSqlReq, dbSqlExecRecord)
|
execRes, err = doSelect(execSqlReq)
|
||||||
case *sqlparser.OtherRead:
|
case *sqlparser.OtherRead:
|
||||||
isSelect = true
|
isSelect = true
|
||||||
execRes, err = doSelect(nil, execSqlReq, dbSqlExecRecord)
|
execRes, err = doSelect(execSqlReq)
|
||||||
case *sqlparser.Update:
|
case *sqlparser.Update:
|
||||||
execRes, err = doUpdate(stmt, execSqlReq, dbSqlExecRecord)
|
execRes, err = doUpdate(stmt, execSqlReq, dbSqlExecRecord)
|
||||||
case *sqlparser.Delete:
|
case *sqlparser.Delete:
|
||||||
@@ -110,7 +112,7 @@ func (d *dbSqlExecAppImpl) GetPageList(condition *entity.DbSqlExec, pageParam *m
|
|||||||
return d.dbSqlExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...)
|
return d.dbSqlExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func doSelect(selectStmt *sqlparser.Select, execSqlReq *DbSqlExecReq, dbSqlExec *entity.DbSqlExec) (*DbSqlExecRes, error) {
|
func doSelect(execSqlReq *DbSqlExecReq) (*DbSqlExecRes, error) {
|
||||||
dbInstance := execSqlReq.DbInstance
|
dbInstance := execSqlReq.DbInstance
|
||||||
sql := execSqlReq.Sql
|
sql := execSqlReq.Sql
|
||||||
colNames, res, err := dbInstance.SelectData(sql)
|
colNames, res, err := dbInstance.SelectData(sql)
|
||||||
|
|||||||
Reference in New Issue
Block a user