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 个回复:
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。