0%

Go_ORM_mysql数据库模版

Go ORM mysql数据库模版

package mysql

// go get -u gorm.io/driver/mysql // 安装mysql 驱动
// go get -u gorm.io/gorm
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"sync"
"testing"
"time"
)

type v1Table struct { // 需要修改的字段映射
Id uint32 `gorm:"column:id;AUTO_INCREMENT"`
Md5Id string `gorm:"column:Md5Id"`
Title string `gorm:"column:title"`
// 创建时间 - 只在第一次插入时设置
InsertTime time.Time `gorm:"column:InsertTime;autoCreateTime"`
// 更新时间 - 每次更新时自动更新
UpTime time.Time `gorm:"column:UpTime;autoUpdateTime"`
}
type v2Table struct { // 需要修改的字段映射
Id uint32 `gorm:"column:id;AUTO_INCREMENT"`
Md5Id string `gorm:"column:Md5Id"`
Title string `gorm:"column:Title"` // 全名称
// 创建时间 - 只在第一次插入时设置
InsertTime time.Time `gorm:"column:InsertTime;autoCreateTime"`
// 更新时间 - 每次更新时自动更新
UpTime time.Time `gorm:"column:UpTime;autoUpdateTime"`
}

func (v1Table) TableName() string {
return "v1Table" // 数据库表的名称
}

func (v2Table) TableName() string {
return "v2Table" // 数据库表的名称
}

// 配置数据库 参数
type config struct {
user string
pass string
adrr string
port string
dbname string
}

var (
db *gorm.DB
dbOnce sync.Once // 确保连接只初始化一次
)

// GetDB 获取数据库连接实例 (线程安全)
func GetDB() *gorm.DB {
if db == nil {
dbOnce.Do(func() {
initDB()
})
}
return db
}

// initDB 初始化数据库连接 (只执行一次)
func initDB() {
conf := &config{
user: "TestDBSql", // 用户名
pass: "msEs3IlksfJi", // 密码
adrr: "127.0.0.1", // 地址
port: "3306", // 端口
dbname: "TestDBSql", // 数据库名称
}

dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local",
conf.user, conf.pass, conf.adrr, conf.port, conf.dbname)

var err error
db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})

if err != nil {
panic("failed to connect database: " + err.Error())
}

// ================= 新增自动迁移逻辑 =================
// 自动创建/更新表结构(注意:GORM的AutoMigrate只会新增字段,不会删除/修改已有字段)
err = db.AutoMigrate(
&VideoTable{},
&MhTable{},
)
if err != nil {
panic("auto migrate failed: " + err.Error())
}

// 配置连接池
sqlDB, err := db.DB()
if err != nil {
panic("failed to get underlying sql.DB: " + err.Error())
}

// 连接池配置
sqlDB.SetMaxIdleConns(10) // 空闲连接数
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
sqlDB.SetConnMaxLifetime(30 * time.Minute) // 连接最大存活时间
}

// 查询内容

// 查询内容
func TestClientDb(t *testing.T) {
db := GetDB()
var V1 v1Table
db.Where("id = ?", 1).First(&video)
ub := &V1{}
err := db.Where("Title = ?", "测试").Find(&ub).Error
if err != nil {
panic(err)
}
fmt.Printf("userBase:%+v", ub)
}

特别说明:

InsertTime time.Time `gorm:"column:InsertTime;autoCreateTime"` 
// autoCreateTime: 只在记录创建时自动设置当前时间

UpTime time.Time `gorm:"column:UpTime;autoUpdateTime"`
// autoUpdateTime: 在创建和更新时都自动设置当前时间