GORM库中的 'gorm.io/gorm' 是GORM库的核心部分,提供了一种ORM框架,用于简化在 Go 语言中与数据库交互的过程,且可以和不同的数据库驱动一起使用,从而实现与各种不同类型的数据库交互。这里我们介绍GORM连接MySQL作为示例。
想要让GORM连接上你自己的数据库,首先要下载数据库驱动。'gorm.io/driver/mysql' 是GORM库的MySQL驱动部分,用于与MySQL数据库进行交互。所以在下载驱动的同时,也确保已正确配置MySQL。当然,GORM提供了多个数据库驱动选项,'gorm.io/driver/mysql' 只是其中之一,专门用于支持 MySQL 数据库,你也可以根据需要选择其他驱动,比如'gorm.io/driver/postgres' 用于PostgreSQL,'gorm.io/driver/sqlite' 用于SQLite等。具体安装操作如下:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
为了方便其他接口和main函数对数据库的调用,我们一般选择在工程文件夹中新建一个子文件夹来编写数据库的初始化(即连接)和增删改查操作。例如
然后给db.go文件定义package和引用的包。
package database
import (
"errors"
"fmt"
"simple-demo-main/commons"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
这里前面提到的两个包是必须import的,其他包根据自己的需求决定。 接下来,就可以开始定义GORM连接MySQL数据库的初始化函数了。
func init() {
dsn := "root:ZYW2545724052@tcp(127.0.0.1:3306)/douyin?charset=utf8mb4&parseTime=True&loc=Loca"
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
fmt.Println("Success connect database")
//引入各数据结构
DB.AutoMigrate(&commons.User{}, &commons.Video{})
}
让我们来逐行解释上述代码。首先,我们需要定义一个数据库连接字符串(DSN, Data Source Name),作用是告诉GORM如何连接到MySQL数据库以及设置一些连接选项。其中,root是你数据库自己的用户名,tcp表示使用TCP/IP协议来建立与数据库服务器的连接,127.0.0.1:3306表示主机和端口号,douyin表示自己建立的数据库名称,charset表示字符集(Character Set)选项,用于指定与数据库通信时使用的字符集编码。
然后,第二句代码则实现了GORM连接到MySQL数据库。具体来说,它做了以下几个步骤:
- mysql.Open(dsn):使用了 GORM 的 MySQL 驱动打开一个与 MySQL 数据库的连接。
- &gorm.Config{}:这是一个GORM的配置对象,用于配置数据库连接的一些选项。在这里,空的配置对象表示使用默认的配置选项。
- gorm.Open(...):这部分代码将第一步和第二步中的结果传递给gorm.Open函数,以打开数据库连接并返回一个 DB对象和一个错误对象err。
最后,DB.AutoMigrate将自定义的结构体映射到数据库中形成表。
完成以上初始化后,我们就可以在main函数中调用该函数来实现后续对数据库的增删改查。 这里我们直接引用了gorm官方提供的增删改查实例。更多详情操作见gorm.io/docs/
// Create
db.Create(&Product{Code: "D42", Price: 100})
// Read
var product Product
db.First(&product, 1) // find product with integer primary key
db.First(&product, "code = ?", "D42") // find product with code D42
// Update - update product's price to 200
db.Model(&product).Update("Price", 200)
// Update - update multiple fields
db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // non-zero fields
db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})
// Delete - delete product
db.Delete(&product, 1)
这里再补充一个小提示。在针对不同接口写特定的增删改查操作时,我们同样可以在package database下实现这些方法,因为在同一个package下我们可以定义一个全局变量DB来接收初始化函数中连接成功后返回的DB来方便数据库的调用。