【GORM(3)】Go的跨时代ORM框架!—— 数据库连接、配置参数;本文从0开始教会如何配置GORM的数据库

数据库连接

GORM官方支持的数据库类型有:MySQL、PostgreSQL、SQlite、SQL Server

连接数据库主要时两个步骤:

  1. 配置DSN
  2. 使用gorm.Open连接数据库

DSN(Data Source Name)

gorm库使用dsn作为连接数据库的参数,dsn翻译:数据源名称;

其主要目的是用来描述数据库连接信息。

一般包含:

  • 数据库连接地址
  • 账号
  • 密码
  • ...

看看案例中的DSN格式:

go 复制代码
username := "root"   // 用户名
password := "123456" // 密码
host := "localhost"
port := "3306"
DbName := "go_test"
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, DbName)

?后面就是连接数据库的配置参数,使用&来定义多个参数

参数 说明 注意
charset 编码字符集 建议utf8mb4,支持更广泛的字符
parseTime 时间类型转换 必加,支持数据库datetimedate类型转为go的time.Time类型
loc 时区 默认Local,必加
timeout 超时时间 定义尝试连接的时间,超出定义的时长后报错
readTimeout 读超时时间 0表示不限制
writeTimeout 写超时时间 0表示不限制

连接数据库

go 复制代码
import(
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
func main(){
    dsn:="username:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime&loc=Local"
    db,err := gorm.Open(mysql.Open(dsn),&gorm.Config{})    
}

GORM支持自定义配置Mysql的配置信息

go 复制代码
db, err := gorm.Open(mysql.New(mysql.Config{
    DSN:                      dsn,
    DefaultStringSize:        191,
    DisableDatetimePrecision: true,
}), &gorm.Config{})

mysql.New(mysql.Config{})使用这个就可以了,mysql.Config结构体内部定义了很多mysql的配置参数;

go 复制代码
type Config struct {
	DriverName                    string
	ServerVersion                 string
	DSN                           string
	DSNConfig                     *mysql.Config
	Conn                          gorm.ConnPool
	SkipInitializeWithVersion     bool
	DefaultStringSize             uint
	DefaultDatetimePrecision      *int
	DisableWithReturning          bool
	DisableDatetimePrecision      bool
	DontSupportRenameIndex        bool
	DontSupportRenameColumn       bool
	DontSupportForShareClause     bool
	DontSupportNullAsDefaultValue bool
	DontSupportRenameColumnUnique bool
	// As of MySQL 8.0.19, ALTER TABLE permits more general (and SQL standard) syntax
	// for dropping and altering existing constraints of any type.
	// see https://dev.mysql.com/doc/refman/8.0/en/alter-table.html
	DontSupportDropConstraint bool
}

针对连接池,Gorm也给出了设置方式,只需通过db进行设置即可

go 复制代码
_db, err := db.DB()
	if err != nil {
		panic(err)
	}
_db.SetMaxIdleConns(10)
_db.SetMaxOpenConns(100)

当我们设置了gorm的配置打印时,我们可以看到每一条日志信息;而我们不想要所有的日志都打印出来,可以使用调试模式

go 复制代码
res := DB.Debug().Model(&Good{}).Where("id=?", id).First(&data)

在发送SQL语句的go代码行中添加Debug()函数即可

go 复制代码
func (db *DB) Debug() (tx *DB) {
	tx = db.getInstance()
	return tx.Session(&Session{
		Logger: db.Logger.LogMode(logger.Info),
	})
}

函数内部也只是定义了日志模式

若在连接数据库时定义,会是全局的打印

go 复制代码
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: logger.Default.LogMode(logger.Info),
})

既然Mysql可以配置连接池,Gorm同样也不止可以设置日志打印的参数,gorm.Config内部还定义了其他的参数

go 复制代码
// Config GORM config
type Config struct {
	// GORM perform single create, update, delete operations in transactions by default to ensure database data integrity
	// You can disable it by setting `SkipDefaultTransaction` to true
	SkipDefaultTransaction    bool
	DefaultTransactionTimeout time.Duration
	DefaultContextTimeout     time.Duration

	// NamingStrategy tables, columns naming strategy
	NamingStrategy schema.Namer
	// FullSaveAssociations full save associations
	FullSaveAssociations bool
	// Logger
	Logger logger.Interface
	// NowFunc the function to be used when creating a new timestamp
	NowFunc func() time.Time
	// DryRun generate sql without execute
	DryRun bool
	// PrepareStmt executes the given query in cached statement
	PrepareStmt bool
	// PrepareStmt cache support LRU expired,
	// default maxsize=int64 Max value and ttl=1h
	PrepareStmtMaxSize int
	PrepareStmtTTL     time.Duration

	// DisableAutomaticPing
	DisableAutomaticPing bool
	// DisableForeignKeyConstraintWhenMigrating
	DisableForeignKeyConstraintWhenMigrating bool
	// IgnoreRelationshipsWhenMigrating
	IgnoreRelationshipsWhenMigrating bool
	// DisableNestedTransaction disable nested transaction
	DisableNestedTransaction bool
	// AllowGlobalUpdate allow global update
	AllowGlobalUpdate bool
	// QueryFields executes the SQL query with all fields of the table
	QueryFields bool
	// CreateBatchSize default create batch size
	CreateBatchSize int
	// TranslateError enabling error translation
	TranslateError bool
	// PropagateUnscoped propagate Unscoped to every other nested statement
	PropagateUnscoped bool

	// ClauseBuilders clause builder
	ClauseBuilders map[string]clause.ClauseBuilder
	// ConnPool db conn pool
	ConnPool ConnPool
	// Dialector database dialector
	Dialector
	// Plugins registered plugins
	Plugins map[string]Plugin

	callbacks  *callbacks
	cacheStore *sync.Map
}

数据库代码编写

go 复制代码
package dao

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

	"gorm.io/gorm"
)

var _db *gorm.DB

func init() {
	username := "root"   // 用户名
	password := "123456" // 密码
	host := "localhost"
	port := "3306"
	DbName := "go_test"

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, port, DbName)
	linkDB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: logger.Default.LogMode(logger.Info),
	})

	db, err := linkDB.DB()
	if err != nil {
		panic(err)
	}
	db.SetMaxIdleConns(10)
	db.SetMaxOpenConns(100)
	_db = linkDB

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

func getDB() *gorm.DB {
	if _db == nil {
		return nil
	}
	return _db
}

使用gorm内部的连接的DB,还是需要通过_db来设置私有变量,再通过方法获取会更好

🥳GORM 专栏前瞻回顾

  1. 【GORM(1)】Go的跨时代ORM框架!本文带你入门GORM! - 目录结构分析、基本CRUD(增删改查)代码直接复制粘贴即可运行!
  2. 【GORM(2)】Go的跨时代ORM框架!本文带你入门GORM!------ 映射模型与表名映射;GORM与JSON对应的标签详情说明;提供数据库SQL

💕👉博客专栏

相关推荐
JienDa1 小时前
JienDa聊PHP:小红书仿站实战深度架构全解析
开发语言·架构·php
d***9352 小时前
springboot3.X 无法解析parameter参数问题
android·前端·后端
q***71013 小时前
Spring Boot(快速上手)
java·spring boot·后端
n***84073 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
执笔论英雄5 小时前
Slime异步原理(单例设计模式)4
开发语言·python·设计模式
马克学长5 小时前
SSM青岛恒星科技学院机房管理系统0k0u9(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·科技·ssm 框架·教育信息化·机房管理系统·青岛恒星科技学院
q***96586 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
7***68437 小时前
Spring Boot 从 2.7.x 升级到 3.3注意事项
数据库·hive·spring boot
L***d6707 小时前
Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚)
java·数据库·spring boot
e***74957 小时前
Modbus报文详解
服务器·开发语言·php