gorm基础-1.gorm连接mysql

需要下载mysql的驱动

go get gorm.io/driver/mysql
go get gorm.io/gorm

简单连接

username := "root"  //账号
password := "root"  //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306        //数据库端口
Dbname := "gorm"   //数据库名
timeout := "10s"    //连接超时,10秒

// root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
  panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
fmt.Println(db)

高级配置

跳过默认事务

为了确保数据一致性,GORM 会在事务里执行写入操作(创建、更新、删除)。如果没有这方面的要求,您可以在初始化时禁用它,这样可以获得60%的性能提升

db, err := gorm.Open(mysql.Open("gorm.db"), &gorm.Config{
  SkipDefaultTransaction: true,
})

不生成实体外键

因为生成实体外键,在数据库层面会进行很多校验

db, err := gorm.Open(mysql.Open("gorm.db"), &gorm.Config{
DisableForeignKeyConstraintWhenMigrating: true,
})

命名策略

gorm采用的命名策略是,表名是蛇形复数,字段名是蛇形单数

例如

type Student struct {
  Name      string
  Age       int
  MyStudent string
}

gorm会为我们这样生成表结构

CREATE TABLE `students` (`name` longtext,`age` bigint,`my_student` longtext)

我们也可以修改这些策略

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  NamingStrategy: schema.NamingStrategy{
    TablePrefix:   "f_",  // 表名前缀
    SingularTable: false, // 单数表名
    NoLowerCase:   false, // 关闭小写转换
  },
})

显示日志

gorm的默认日志是只打印错误和慢SQL

我们可以自己设置

var mysqlLogger logger.Interface
// 要显示的日志等级
mysqlLogger = logger.Default.LogMode(logger.Info)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  Logger: mysqlLogger,
})

如果你想自定义日志的显示

那么可以使用如下代码

newLogger := logger.New(
  log.New(os.Stdout, "\r\n", log.LstdFlags), // (日志输出的目标,前缀和日志包含的内容)
  logger.Config{
    SlowThreshold:             time.Second, // 慢 SQL 阈值
    LogLevel:                  logger.Info, // 日志级别
    IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
    Colorful:                  true,        // 使用彩色打印
  },
)

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  Logger: newLogger,
})

部分展示日志

var model Student
session := DB.Session(&gorm.Session{Logger: newLogger})
session.First(&model)
// SELECT * FROM `students` ORDER BY `students`.`name` LIMIT 1

如果只想某些语句显示日志

DB.Debug().First(&model)
<think>嗯,用户问的是怎么用GORM连接MySQL。首先我要确认GORM是什么,对吧?GORM是Go语言的一个ORM库,用来操作数据库的。用户可能已经知道一些Go的基础,现在想用ORM来简化数据库操作。那连接MySQL需要哪些步骤呢? 首先,得确保用户已经安装了GORMMySQL的驱动。GORM的文档里提到需要导入gorm.io/gormgorm.io/driver/mysql这两个包。可能用户没装的话,需要先go get这些包。然后,连接字符串的格式应该是怎样的?通常是用户名:密码@协议(地址:端口)/数据库名?参数,比如dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"。这里charset和parseTime这些参数是不是必须的?可能需要解释一下每个参数的作用,比如parseTime是为了正确处理时间类型,loc设置时区。 然后,用gorm.Open(mysql.Open(dsn), &gorm.Config{})来连接。如果连接失败,可能有几种情况,比如密码错误、MySQL服务没启动、端口不对,或者网络问题。需要提醒用户检查这些方面。另外,连接成功后,可能需要配置连接池,设置最大空闲连接数和最大打开连接数,这样在高并发时性能更好。比如用sqlDB, err := db.DB()然后设置sqlDB.SetMaxIdleConns(10)和SetMaxOpenConns(100)。 用户可能还关心如何测试连接是否成功,比如执行一个简单的Ping操作。或者如何自动迁移表结构,用db.AutoMigrate(&User{})这样的代码。可能用户是新手,所以需要详细说明每一步,避免遗漏。另外,要注意错误处理,每个步骤都可能出错,比如Open的时候,或者AutoMigrate的时候,需要检查错误并处理。 还有,用户可能想知道如何关闭数据库连接,虽然GORM会自动管理,但显式关闭也是好的实践。比如在main函数结束前调用sqlDB.Close()。另外,日志模式的控制,比如设置logger的级别,方便调试,但生产环境可能需要关闭。 还要考虑用户的实际应用场景,比如他们是否在使用框架,比如Gin,或者只是单纯的Go项目。可能需要给出一个完整的示例代码,从导入包到连接,配置,定义模型,迁移,最后执行查询等操作。这样用户可以直接复制代码并根据自己的配置修改。 总结下来,回答的结构应该是先介绍GORM和需要的驱动,然后分步骤讲解如何连接,配置连接字符串,处理错误,配置连接池,自动迁移,以及示例代码。同时,提醒常见的连接问题和注意事项,比如参数设置,时区问题,网络可达性等。可能还需要提到不同版本的GORM或驱动是否有差异,确保用户使用的是兼容的版本。</think>让我们通过**架构师视角**剖析GORM连接MySQL的全流程,包含核心配置、性能优化和异常处理方案: --- ### 基础连接代码(含安全规范) ```go package main import ( "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) func main() { // 标准DSN格式(生产环境建议使用环境变量) dsn := "username:Password123@tcp(127.0.0.1:3306)/mydb?charset=utf8mb4&parseTime=True&loc=Local" // 连接配置(关键参数说明) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: logger.Default.LogMode(logger.Warn), // 生产环境推荐关闭INFO日志 PrepareStmt: true, // 开启预编译提升性能 SkipDefaultTransaction: true, // 按需关闭默认事务 }) if err != nil { panic("数据库连接失败: " + err.Error()) } // 获取底层连接池(重要性能配置) sqlDB, _ := db.DB() sqlDB.SetMaxIdleConns(10) // 空闲连接池大小 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大存活时间 } ``` --- ### 配置解析清单 🔍 | 参数 | 作用说明 | 推荐值 | |----------------------|---------------------------------|------------------| | charset=utf8mb4 | 支持完整Unicode字符 | 必须 | | parseTime=True | 正确处理time.Time类型 | 必须 | | loc=Local | 时区设置(建议与系统一致) | Asia/Shanghai | | allowNativePasswords | MySQL 8.0+认证协议兼容 | true(按需) | | timeout | 连接超时控制 | 5s | --- ### 高级连接方案 🚀 1. **多数据源配置** ```go // 主从分离示例 masterDB, _ := gorm.Open(mysql.Open(masterDSN)) replicaDB, _ := gorm.Open(mysql.Open(replicaDSN)) // 通过Tag指定读写分离 db.Use(dbresolver.Register(dbresolver.Config{ Sources: []gorm.Dialector{mysql.Open(masterDSN)}, Replicas: []gorm.Dialector{mysql.Open(replicaDSN)}, })) ``` 2. **TLS加密连接** ```go dsn += "&tls=custom" // 需提前配置MySQL服务端证书 mysql.RegisterTLSConfig("custom", &tls.Config{ ServerName: "mysql.example.com", }) ``` --- ### 排错指南 🛠️ 1. **连接超时** - 检查防火墙规则(云服务器需配置安全组) - 使用`telnet 127.0.0.1 3306`验证端口可达性 2. **认证失败** - MySQL 8.0+需要设置:`ALTER USER 'user' IDENTIFIED WITH mysql_native_password BY 'password';` - 添加连接参数:`allowNativePasswords=true` 3. **时区异常** - 确保数据库时区与Go环境一致 - 连接字符串添加`loc=Asia%2FShanghai`(URL编码) --- ### 性能优化建议 ⚡ 1. **连接池监控** ```go // 定期输出连接状态 go func() { ticker := time.NewTicker(5 * time.Minute) for { stats := sqlDB.Stats() log.Printf("连接池状态: 使用中=%d 空闲=%d", stats.InUse, stats.Idle) <-ticker.C } }() ``` 2. **Prepared Statement缓存** ```go db.WithContext(ctx).PreparedStmtMode(clause.PreparedStmtModeWhere).Find(&users) ``` --- **架构师提示**:生产环境建议配合配置中心实现动态DSN加载,并通过健康检查机制实现数据库故障自动转移。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值