marge: 合并11.2版本
This commit is contained in:
167
lib/dborm/dbgorm.go
Normal file
167
lib/dborm/dbgorm.go
Normal file
@@ -0,0 +1,167 @@
|
||||
package dborm
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"gorm.io/driver/mysql"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/logger"
|
||||
)
|
||||
|
||||
// 数据库连接实例
|
||||
var dbgEngine *gorm.DB
|
||||
|
||||
// 载入连接日志配置
|
||||
func loadLogger() logger.Interface {
|
||||
newLogger := logger.New(
|
||||
log.New(os.Stdout, "[GORM] ", log.LstdFlags), // 将日志输出到控制台
|
||||
logger.Config{
|
||||
SlowThreshold: time.Second, // Slow SQL 阈值
|
||||
LogLevel: logger.Info, // 日志级别 Silent不输出任何日志
|
||||
ParameterizedQueries: false, // 参数化查询SQL 用实际值带入?的执行语句
|
||||
Colorful: false, // 彩色日志输出
|
||||
},
|
||||
)
|
||||
return newLogger
|
||||
}
|
||||
|
||||
// 连接数据库实例
|
||||
func InitGormConnect(dbType, dbUser, dbPassword, dbHost, dbPort, dbName, dbParam, dbLogging any) error {
|
||||
var dialector gorm.Dialector
|
||||
switch dbType {
|
||||
case "mysql":
|
||||
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s",
|
||||
dbUser,
|
||||
dbPassword,
|
||||
dbHost,
|
||||
dbPort,
|
||||
dbName,
|
||||
dbParam,
|
||||
)
|
||||
dialector = mysql.Open(dsn)
|
||||
default:
|
||||
err := fmt.Errorf("invalid type: %s", dbType)
|
||||
return err
|
||||
}
|
||||
opts := &gorm.Config{}
|
||||
// 是否需要日志输出
|
||||
if dbLogging.(bool) {
|
||||
opts.Logger = loadLogger()
|
||||
}
|
||||
// 创建连接
|
||||
db, err := gorm.Open(dialector, opts)
|
||||
if err != nil {
|
||||
log.Fatalf("failed to open: %s", err)
|
||||
return err
|
||||
}
|
||||
// 获取底层 SQL 数据库连接
|
||||
sqlDB, err := db.DB()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect DB pool: %v", err)
|
||||
return err
|
||||
}
|
||||
// 测试数据库连接
|
||||
err = sqlDB.Ping()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to ping database: %v", err)
|
||||
return err
|
||||
}
|
||||
dbgEngine = db
|
||||
return nil
|
||||
}
|
||||
|
||||
// 关闭数据库实例
|
||||
func Close() {
|
||||
sqlDB, err := dbgEngine.DB()
|
||||
if err != nil {
|
||||
log.Fatalf("failed to connect pool: %s", err)
|
||||
}
|
||||
if err := sqlDB.Close(); err != nil {
|
||||
log.Fatalf("failed to close: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
// default gorm DB
|
||||
func DefaultDB() *gorm.DB {
|
||||
return dbgEngine
|
||||
}
|
||||
|
||||
// get sql DB
|
||||
func GCoreDB() (*sql.DB, error) {
|
||||
return dbgEngine.DB()
|
||||
}
|
||||
|
||||
// RawSQL 原生查询语句
|
||||
func RawSQL(sql string, parameters []any) ([]map[string]any, error) {
|
||||
// 数据源
|
||||
db := DefaultDB()
|
||||
|
||||
// 使用正则表达式替换连续的空白字符为单个空格
|
||||
fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ")
|
||||
|
||||
// logger.Infof("sql=> %v", fmtSql)
|
||||
// logger.Infof("parameters=> %v", parameters)
|
||||
|
||||
// 查询结果
|
||||
var rows []map[string]any
|
||||
res := db.Raw(fmtSql, parameters...).Scan(&rows)
|
||||
if res.Error != nil {
|
||||
return nil, res.Error
|
||||
}
|
||||
return rows, nil
|
||||
}
|
||||
|
||||
// ExecSQL 原生执行语句
|
||||
func ExecSQL(sql string, parameters []any) (int64, error) {
|
||||
// 数据源
|
||||
db := DefaultDB()
|
||||
|
||||
// 使用正则表达式替换连续的空白字符为单个空格
|
||||
fmtSql := regexp.MustCompile(`\s+`).ReplaceAllString(sql, " ")
|
||||
// 执行结果
|
||||
res := db.Exec(fmtSql, parameters...)
|
||||
if res.Error != nil {
|
||||
return 0, res.Error
|
||||
}
|
||||
return res.RowsAffected, nil
|
||||
}
|
||||
|
||||
func CloneTable(srcTable, dstTable string) error {
|
||||
// 获取表 A 的结构信息
|
||||
var columns []gorm.ColumnType
|
||||
dbMigrator := dbgEngine.Migrator()
|
||||
columns, err := dbMigrator.ColumnTypes(srcTable)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to ColumnTypes, %v", err)
|
||||
}
|
||||
|
||||
// 创建表 destination table
|
||||
err = dbMigrator.CreateTable(dstTable)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to CreateTable, %v", err)
|
||||
}
|
||||
// 复制表 src 的字段到表 dst
|
||||
for _, column := range columns {
|
||||
err = dbMigrator.AddColumn(dstTable, column.Name())
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// 复制表 src 的主键和索引到表 dst
|
||||
err = dbMigrator.CreateConstraint(dstTable, "PRIMARY")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
|
||||
err = dbMigrator.CreateConstraint(dstTable, "INDEX")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to AddColumn, %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import (
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"xorm.io/xorm"
|
||||
"xorm.io/xorm/core"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -124,6 +125,14 @@ func XormConnectDatabase(dbType, dbUser, dbPassword, dbHost, dbPort, dbName stri
|
||||
return xEngine, nil
|
||||
}
|
||||
|
||||
func XCoreDB() *core.DB {
|
||||
return xEngine.DB()
|
||||
}
|
||||
|
||||
func XEngDB() *xorm.Engine {
|
||||
return xEngine
|
||||
}
|
||||
|
||||
func ConstructInsertSQL(tableName string, insertData interface{}) (string, []string) {
|
||||
log.Debug("ConstructInsertSQL processing... ")
|
||||
log.Debug("Request insertData:", insertData)
|
||||
@@ -419,68 +428,6 @@ func XormParseResult(body []byte) ([]NeInfo, error) {
|
||||
return neInfo, nil
|
||||
}
|
||||
|
||||
type ParamConfig struct {
|
||||
// Id int `json:"id" xorm:"pk 'id' autoincr"`
|
||||
NeType string `json:"neType"`
|
||||
NeId string `json:"neId"`
|
||||
TopTag string `json:"topTag"`
|
||||
TopDisplay string `json:"topDisplay"`
|
||||
ParamJson string `json:"paramJson"`
|
||||
}
|
||||
|
||||
func XormInsertParamConfig(mapJson *map[string]interface{}) (int64, error) {
|
||||
var affected, a int64
|
||||
var err error
|
||||
paramConfig := new(ParamConfig)
|
||||
for n, d := range *mapJson {
|
||||
if d == nil {
|
||||
break
|
||||
}
|
||||
log.Debugf("n: %s", n)
|
||||
|
||||
for t, p := range d.(map[string]interface{}) {
|
||||
if p == nil {
|
||||
break
|
||||
}
|
||||
log.Debug("t:", t)
|
||||
log.Debug("p:", p)
|
||||
for k, v := range p.(map[string]interface{}) {
|
||||
log.Debug("k, v: ", k, v)
|
||||
if k == "display" {
|
||||
paramConfig.TopDisplay = fmt.Sprintf("%v", v)
|
||||
|
||||
} else {
|
||||
pc, _ := json.Marshal(v)
|
||||
paramConfig.ParamJson = fmt.Sprintf("{\"%v\":%v}", k, string(pc))
|
||||
}
|
||||
}
|
||||
|
||||
paramConfig.NeType = strings.ToUpper(n)
|
||||
paramConfig.NeId = ""
|
||||
paramConfig.TopTag = t
|
||||
// paramConfig.TopDisplay = p["display"]
|
||||
// paramConfig.ParamJson = p.(string)
|
||||
|
||||
log.Debug("paramConfig:", paramConfig)
|
||||
|
||||
xSession := xEngine.NewSession()
|
||||
defer xSession.Close()
|
||||
_, err = xSession.Table("param_config").Where("ne_type = ? and top_tag = ?", paramConfig.NeType, paramConfig.TopTag).Delete()
|
||||
if err != nil {
|
||||
log.Error("Failed to insert param_config:", err)
|
||||
}
|
||||
a, err = xSession.Insert(paramConfig)
|
||||
if err != nil {
|
||||
log.Error("Failed to insert param_config:", err)
|
||||
}
|
||||
affected += a
|
||||
xSession.Commit()
|
||||
}
|
||||
}
|
||||
|
||||
return affected, err
|
||||
}
|
||||
|
||||
func ConstructUpdateSQLArray(tableName string, updateData interface{}, whereCondition string) (string, []string) {
|
||||
log.Debug("ConstructUpdateSQL processing... ")
|
||||
log.Debug("Request updateData:", updateData)
|
||||
|
||||
Reference in New Issue
Block a user