尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

【GORM(3)】Go的跨时代ORM框架!—— 数据库连接、配置参数;本文从0开始教会如何配备GORM的数据库
📅 发布时间:2026/6/23 11:09:16

数据库连接

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

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

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

DSN(Data Source Name)

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

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

一般包含:

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

看看案例中的DSN格式:

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时间类型转换必加,支持数据库datetime和date类型转为go的time.Time类型
loc时区默认Local,必加
timeout超时时间定义尝试连接的时间,超出定义的时长后报错
readTimeout读超时时间0表示不限制
writeTimeout写超时时间0表示不限制

连接数据库

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的配置信息

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

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

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进行设置即可

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

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

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

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

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

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

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

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

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

// 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
}

数据库代码编写

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

博客专栏

  • SpringCloud微服务-从Spring出发学习从0学习微服务!

  • Golang专栏-包含基础、Gin、Goam等知识

  • 云原生专栏-包含k8s、docker等知识

  • 从0开始学习云计算-华为HCIP证书

  • JUC专栏-带你快速领悟JUC的知识!

  • JVM专栏-深入Java虚拟机,理解JVM的原理

  • 基于Java研究 数据结构与算法-包含贪心算法、加权图、最短路径算法等知识

  • Docker专栏-上手热门容器技术Docker

  • SpringBoot专栏-学习SpringBoot快速开发后端

  • 项目管理工具的学习-设计技术:Maven、Git、Gradle等相关管理工具

  • JavaSE-全面了解Java基础

  • JS专栏-使用JS作的一部分实例~

  • 使用CSS所作的一部分案例

相关新闻

  • 用你的生日,取一个微信昵称
  • 2025年12月苏州装修品牌调研:盛世和家装饰的售后服务深度解析 - 品牌测评鉴赏家
  • Rust 实战:手把手教你实现高性能快速排序

最新新闻

  • Awaken:终极跨平台EPUB阅读器 - 基于WebDAV的免费全平台同步解决方案
  • Renaissance Plateforme安全架构:保护政治数据隐私的10个关键策略
  • AI语音克隆未来展望:语音克隆技术的发展趋势与伦理考量
  • TaskJuggler资源分配技巧:让团队效率最大化的秘密武器
  • UI-TARS技术深度解析:多模态智能体在GUI自动化领域的创新突破
  • X-SwiftFormat vs 其他格式化工具:为什么它是Swift开发者的最佳选择

日新闻

  • Arduino-ESP32项目深度解析:解锁隐藏芯片支持与架构演进
  • 2026年 系统窗厂家/品牌推荐榜单:隔音系统窗+高端系统门窗的核心优势与选购指南 - 品牌发掘
  • NVBench:首个双语非言语发声语音合成评测基准详解与实践

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号