database/sql 是 Go 标准库中提供的对数据库访问的抽象接口,它可以通过实现 driver 接口来支持多种数据库。使用 database/sql 可以轻松地开发基于 Go 的数据库应用程序,同时保证了代码的可移植性。
database/sql 主要由 DB 和 Stmt 两个类型组成。其中,DB 类型代表一个数据库连接,它可以通过 Open 函数打开一个新的数据库连接;Stmt 类型则表示了一条 SQL 语句的执行计划,可以通过 Prepare 函数创建并执行。除了这些基本类型之外,database/sql 还提供了一系列方便的操作函数来简化开发工作。
与 database/sql 相关的 ORM 框架中,比较流行的就是 GORM。GORM 为 Go 开发者提供了高度可扩展和灵活的接口,使得 Go 开发者可以更容易地使用数据库。GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 和 SQL Server 等。与 database/sql 不同的是,GORM 提供了可读性更好、更易于维护的代码风格,同时也提供了更加高级的功能。例如,GORM 提供了强大的 ORM 功能,使得数据表结构映射到 Go 语言的结构体非常方便。此外,GORM 还支持事务处理、批量操作、自动创建数据表等高级功能。
下面是一个使用 GORM 连接 MySQL 数据库的例子:
复制代码
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type User struct {
gorm.Model
Name string
Age int
}
func main() {
dsn := "root:password@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
fmt.Println("Database connected successfully!")
db.AutoMigrate(&User{})
user := User{Name: "Tom", Age: 18}
db.Create(&user)
var result User
db.First(&result, user.ID)
fmt.Println(result.Name, result.Age)
}
在这个例子中,我们首先使用 mysql.Open 函数打开了一个 MySQL 数据库连接,然后通过调用 AutoMigrate 函数将 User 模型映射到数据库。接着,我们创建了一个新的用户并将其保存到数据库中。最后,我们使用 First 函数从数据库中读取到了刚刚创建的用户,并输出其姓名和年龄。
需要注意的是,本例中我们使用了 GORM 提供的自动迁移功能,它会自动地在数据库中创建相应的表。同时,我们还使用了 GORM 内置的 CRUD 函数,如 Create 和 First,以便更加方便地操作数据库。