gorm使用yaml 配置mysql和sqlite

gorm使用yaml 配置mysql和sqlite

建立配置文件 config/application.yaml

database:
  dbname: /data/goapi.db

或 config/application.yaml mysql配置文件

database:
  driverName: mysql
  host: localhost
  port: 3306
  dbname: test
  username: test
  password: test
  charset: utf8mb4
  loc:  Asia/Shanghai

读取配置文件 main.go,建立 InitConfig 方法 读取配置

// InitConfig 读取配置文件
func InitConfig() {
	workDir, _ := os.Getwd() //读取工作目录
	viper.AddConfigPath(workDir + "/config")
	viper.SetConfigName("application") //读取配置文件名和类型
	viper.SetConfigType("yml")
	err := viper.ReadInConfig()
	if err != nil {
		println(err)
	}
}

在models/database.go 里建立生成数据连接

package models

import (
	"fmt"
	"github.com/spf13/viper"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"net/url"
)

var DB *gorm.DB

// main.go 里要初始数据库连接
func InitDb() *gorm.DB {
	host := viper.GetString("database.host")
	port := viper.GetString("database.port")
	dbname := viper.GetString("database.dbname")
	username := viper.GetString("database.username")
	password := viper.GetString("database.password")
	charset := viper.GetString("database.charset")
	loc := viper.GetString("database.loc")
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true&loc=%s",
		username,
		password,
		host,
		port,
		dbname,
		charset,
		url.QueryEscape(loc))
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	db.Logger = logger.Default.LogMode(logger.Silent)
	if err != nil {
		panic("fail to connect database, err: " + err.Error())
	}
        //关闭sql 日志
	//db.Logger = logger.Default.LogMode(logger.Silent)
        //打开sql日志
	db.Logger = logger.Default.LogMode(logger.Info)        

	//自动生成表,指定使用InnoDB引擎生成
	//db.Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&Category{}) //使用InnoDB引擎生成
	//db.Set("gorm:table_options", "ENGINE=InnoDB").Migrator().CreateTable(&Article{})
	

        //自动生成表
	err =db.AutoMigrate(&Category{}, &Article{})
        if err != nil {
		panic("fail to AutoMigrate, err: " + err.Error())
	}
	DB = db
	return db
}

// InitDB sqlite 初始sqlite的连接
func InitDB() *gorm.DB {
	dbname := viper.GetString("database.dbname")
	db, err := gorm.Open(sqlite.Open(dbname), &gorm.Config{})
	if err != nil {
		panic("fail to connect database, err: " + err.Error())
	}
        //关闭sql 日志
	//db.Logger = logger.Default.LogMode(logger.Silent)
        //打开sql日志
	db.Logger = logger.Default.LogMode(logger.Info)
	
        //自动生成表
	err = db.AutoMigrate(&Country{}, &BsCountry{})
	if err != nil {
		panic("fail to AutoMigrate, err: " + err.Error())
	}
	DB = db
	return db
}

// 初始完之后,直接可以调用 models.GetDB() 使用
func GetDB() *gorm.DB {
	return DB
}

main.go 里面 初始完后使用

func SaveArticle(Article *models.Article) (*models.Article, error) {
	db := models.GetDB()
	if db == nil {
		return nil, errors.New("database connection is nil")
	}

	tx := db.Begin()
	defer func() {
		if r := recover(); r != nil {
			tx.Rollback()
		}
	}()

	var newArticle models.Article
	err := tx.Where("id=?", Article.ID).First(&newArticle).Error
	if err != nil {
		if !errors.Is(err, gorm.ErrRecordNotFound) {
			tx.Rollback()
			return nil, err
		}
		// 记录不存在,尝试创建新的ArticleArticle
		if err := tx.Create(Article).Error; err != nil {
			tx.Rollback()
			return nil, err
		}
	} else {
		// 记录存在,更新现有记录
		if err := tx.Save(Article).Error; err != nil {
			tx.Rollback()
			return nil, err
		}
	}

	if err := tx.Commit().Error; err != nil {
		return nil, err
	}

	return Article, nil
}


func main() {
	//初始化配置
	InitConfig()
	//初始化数据库
	models.InitDB()
        var category model.Category{ID:1,Name:"Category1"}
        //新建和更新
        create_category, err := services.SaveCategory(&category)
       
}
gorm使用yaml 配置mysql和sqlite”上有 1 个回复:
  • 一位 WordPress 评论者 日期 2024年12月28日,时间 下午3:48

    您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar

发表回复

*您的电子邮件地址不会被公开。必填项已标记为 。

*
*