Gorm连接MYSQL数据库|青训营

504 阅读5分钟

Gorm 是一个用 Go 语言编写的 ORM (Object-Relational Mapping) 工具,它可以帮助开发者更简单地操作数据库。以下是使用 Gorm 连接 MySQL 数据库进行基本增、删、查、改的操作:

  1. 连接到 MySQL 数据库

首先,需要安装 Gorm 和 MySQL 驱动:

bashCopy code
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

bashCopy code

这个是一个常见的代码块标注,用于指示下面的内容是在 bash(一个流行的 Unix shell)中执行的代码。但通常,这种标注主要在 Markdown 或其他文档中使用,不是实际要执行的内容。

go get -u gorm.io/gorm

go get: 这是 Go 的命令行工具 go 的一个子命令,用于从远程仓库下载并安装 Go 包。 -u: 这个参数的意思是同时更新所指定的包和它的依赖。 gorm.io/gorm: 这是 Gorm` ORM 库的导入路径。命令会从这个路径下载并安装 Gorm。

go get -u gorm.io/driver/mysql

go get: 同上,用于下载并安装 Go 包。 -u: 同上,用于同时更新指定的包及其依赖。 gorm.io/driver/mysql: 这是 Gorm 的 MySQL 驱动的导入路径。为了让 Gorm 能够与 MySQL 数据库交互,需要安装这个驱动。

然后,使用以下代码连接到 MySQL:

goCopy code
package main

import (
    "gorm.io/gorm"
    "gorm.io/driver/mysql"
)

func main() {
    dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
        panic("failed to connect database")
    }
}

package main

指明这是一个主程序包。Go 程序的执行从这个包的 main() 函数开始。

import ...

这是导入所需的库或模块的部分。

"gorm.io/gorm"`: 导入 Gorm ORM 主要的库。

"gorm.io/driver/mysql"`: 导入 Gorm 的 MySQL 驱动,使 Gorm 能够与 MySQL 数据库交互。

func main() { ... }

这是程序的主入口点,即程序执行时首先运行的函数。

dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" 这行定义了一个名为 dsn 的字符串变量。DSN(数据源名称)是数据库连接的配置字符串,包含:

usernamepassword: 用于登录数据库的用户名和密码。 tcp(127.0.0.1:3306): 数据库的网络类型及其地址和端口。这里使用的是 TCP 协议,并连接到本地(127.0.0.1)的 3306 端口,这是 MySQL 默认的端口。 /dbname: 指定要连接的数据库名称。 其他参数: 如字符集 charset=utf8mb4,时间解析 parseTime=True,时区设置 loc=Local 等。

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

使用 `gorm.Open` 方法尝试连接到数据库。这个函数接受两个参数:

mysql.Open(dsn): 用于打开一个新的 MySQL 数据库连接,它需要一个 DSN 字符串作为参数。 &gorm.Config{}: Gorm 的配置。这里使用了默认配置。

如果连接成功,gorm.Open 返回数据库连接句柄 db。否则,它返回一个错误 err

if err != nil { ... }

这个 if 语句用于检查上一步是否出错。如果 err 不为 nil(即存在错误),则执行括号中的代码。

panic("failed to connect database")

如果存在连接错误,这行代码会引发一个 panic,停止程序执行,并打印错误消息“failed to connect database”。

  1. 定义模型
goCopy code
type User struct {
    ID    uint   `gorm:"primaryKey"`
    Name  string
    Age   int
}

这定义了一个名为 User 的结构体,表示数据库中的一个用户。其中:

  • ID: 用户的唯一标识符。gorm:"primaryKey" 标签指定它为主键。
  • Name: 用户的名字,是一个字符串字段。
  • Age: 用户的年龄,是一个整数字段。
  1. 增(Create)
goCopy code
user := User{Name: "John", Age: 25}
result := db.Create(&user)
if result.Error != nil {
    // Handle error
}

这部分代码创建了一个新的 User 实例,并尝试将其添加到数据库中:

  • 先创建一个 User 实例,并为 NameAge 赋值。
  • 使用 db.Create 方法将用户添加到数据库。如果出错,错误信息会保存在 result.Error 中。
  1. 查(Read)
  • 获取第一条记录:
goCopy code
var user User
db.First(&user)

这里创建了一个空的 User 实例,并使用 db.First 方法查询并获取数据库中的第一个用户记录。

  • 使用主键查询:
goCopy code
var user User
db.First(&user, 1)  // 根据整型 ID 查找
  • 使用条件查询:
goCopy code
var users []User
db.Where("name = ?", "John").Find(&users)
  1. 改(Update)
  • 更新模型的某些字段:
goCopy code
db.Model(&user).Update("Name", "Jane")
  • 更新多个字段:
goCopy code
db.Model(&user).Updates(User{Name: "Jane", Age: 26})
  1. 删(Delete)
goCopy code
db.Delete(&user)

注意: 使用 Gorm 连接 MySQL 数据库时,需要注意以下几点以确保连接的稳定性和数据的安全性:

  1. 确保安装正确的驱动和版本: 在连接 MySQL 之前,确保已经正确安装了 Gorm 和适当的 MySQL 驱动。

  2. 正确配置 DSN:

    • 确保所有配置信息(如用户名、密码、数据库名等)都是正确的。
    • 使用 parseTime=True 以确保能够正确解析 MySQL 中的时间和日期数据类型。
    • 考虑使用 charset=utf8mb4 以支持全字符集,包括 emoji。
  3. 错误处理: 总是检查数据库操作后返回的错误,如连接错误、查询错误等,并适当地处理这些错误。

  4. 连接池管理: Gorm 使用 Go 的内置数据库连接池。你可以设置连接池的大小和闲置连接的数量,这对于高并发应用很重要。

  5. 避免 SQL 注入: 尽量使用 Gorm 的方法而不是直接的 SQL 查询,或者确保你的 SQL 查询参数化,以避免 SQL 注入攻击。

  6. 数据库迁移: 使用 Gorm 进行数据库迁移时要格外小心。始终在生产之前在开发或测试环境中测试迁移,并备份数据库。

  7. 主键和索引: 确保模型中有适当的主键,并考虑为经常查询的字段添加索引以提高查询性能。

  8. 日志记录: Gorm 提供了日志功能,可以记录所有的 SQL 查询。这对于调试和监视很有用,但在生产环境中可能需要考虑日志级别,以避免记录敏感信息或产生过多的日志。

  9. 关闭数据库连接: 当你的应用程序或服务结束时,确保关闭数据库连接。尽管 Go 的 db 对象会自动处理连接池,但显式地关闭它是个好习惯。

  10. 并发安全: Gorm 是并发安全的,但在高并发环境中进行数据库操作时仍需注意。确保不在多个 goroutines 中共享单个 gorm.DB 实例,而是为每个请求或任务创建新的实例。