gorm連接mysql的初始化配置


包含mysql配置、gorm配置、連接池配置、log日志配置

init_db_log.go文件代碼

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"time"
)

const (
	host   = "xxx"
	port   = 3306
	user   = "root"
	passwd = "xxxx"
	dbName = "topgoer_gorm"
	other  = "charset=utf8mb4&parseTime=True&loc=Local"
)

type Writer struct {
}

func (w Writer) Printf(format string, args ...interface{}) {
	slowSql := fmt.Sprintf(format, args...)
	// 出可以將慢查詢信息寫入到sentry日志當中去
	fmt.Println(slowSql)
	/*
		C:/Users/mayanan/Desktop/pro_go/topgoer_gorm/main.go:53 SLOW SQL >= 80ms
		[235.827ms] [rows:3] SELECT * FROM `users` WHERE `users`.`deleted` IS NULL
	*/
}

func InitDB() *gorm.DB {
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", user, passwd, host, port, dbName, other)

	newLogger := logger.New(
		Writer{},
		logger.Config{
			SlowThreshold:             200 * time.Millisecond, // Slow SQL threshold
			LogLevel:                  logger.Warn,           // Log level
			IgnoreRecordNotFoundError: true,                  // Ignore ErrRecordNotFound error for logger
			Colorful:                  true,                 // Disable color
		},
	)

	// MySQl 驅動程序提供了 一些高級配置 可以在初始化過程中使用
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       dsn,
		DefaultStringSize:         256,   // string 類型字段的默認長度
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度,MySQL 5.6 之前的數據庫不支持
		DontSupportRenameIndex:    true,  // 重命名索引時采用刪除並新建的方式,MySQL 5.7 之前的數據庫和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列,MySQL 8 之前的數據庫和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根據當前 MySQL 版本自動配置
	}), &gorm.Config{
		// 使用CreateBatchSize 選項初始化 GORM 時,所有的創建& 關聯 INSERT 都將遵循該選項
		CreateBatchSize: 1000,
		// 全局模式:執行任何 SQL 時都創建並緩存預編譯語句,可以提高后續的調用速度
		PrepareStmt: true,
		// 注意 QueryFields 模式會根據當前 model 的所有字段名稱進行 select。
		//QueryFields: true,
		Logger: newLogger,
		// 表名加前綴和禁用復數表名
		NamingStrategy: schema.NamingStrategy{
			TablePrefix: "t_",   // 表名前綴,`User`表為`t_users`
			SingularTable: true, // 使用單數表名,啟用該選項后,`User` 表將是`user`
		},
	})

	if err != nil {
		fmt.Println("conn mysql fail", err)
		return nil
	}

	sqlDb, _ := db.DB()
	// 對於中小型 web 應用程序,我通常使用以下設置作為起點,然后根據負載測試結果和實際吞吐量級別進行優化。
	// SetMaxIdleConns: 設置空閑連接池中鏈接的最大數量
	sqlDb.SetMaxIdleConns(25)
	// SetMaxOpenConns: 設置打開數據庫鏈接的最大數量
	sqlDb.SetMaxOpenConns(25)
	// SetConnMaxLifetime: 設置鏈接可復用的最大時間
	sqlDb.SetConnMaxLifetime(5 * time.Minute)

	return db

}

main.py文件

package main

import (
	"database/sql"
	"fmt"
	uuid "github.com/satori/go.uuid"
	"gorm.io/gorm"
	"time"
)

func myPrint(p interface{}) {
	fmt.Printf("type: %T\tvalue: %v\n", p, p)
}

type User struct {
	ID        int            `gorm:"primaryKey;autoIncrement"`
	Name      sql.NullString `gorm:"default:'隔壁老王'"`
	Age       uint8          `gorm:"default:55"`
	UUID      uuid.UUID
	CreatedAt time.Time `gorm:"autoCreateTime"`
	Deleted gorm.DeletedAt `gorm:"autoDeleteTime"`
}
/*
	func (u *User) AfterFind(tx *gorm.DB) (err error) {
		fmt.Println("User AfterFind執行了")
		return
	}
*/
type Email struct {
	UserID int
	Email string
}
type SlowSql struct {
	FileRow string
	Slow string
	Ms float64
	Rows int64
	Sql string
	gorm.Model
}

var db *gorm.DB
func main() {
	db = InitDB()

	// 自動檢查User結構是否發生變化,變化則進行遷移
	db.AutoMigrate(&User{})
	db.AutoMigrate(&Email{})
	db.AutoMigrate(&SlowSql{})

	// Context
	var users []User
	db.Debug().Find(&users)

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM