gorm:初识gorm
初识gorm
什么是 Gorm
Gorm 是一个使用 Go 语言开发的 ORM 库,它提供了一种方便的方式来处理数据库操作。它允许开发人员使用面向对象的方式来处理数据库表和记录,而不需要直接编写复杂的 SQL 查询语句。Gorm 的设计目标是简单易用,同时提供了一系列强大的特性,例如高级查询、事务管理等。
为什么选择 Gorm
- 简化数据库操作:使用 Gorm,你可以使用简单的代码来执行各种数据库操作,例如创建、读取、更新和删除数据,而无需编写冗长的 SQL 查询语句。
- 高级查询功能:Gorm 提供了强大的查询功能,包括条件查询、排序、分页等。这使得在处理复杂查询时变得更加轻松和灵活。
- 跨数据库支持:Gorm 支持多种主流数据库,包括 MySQL、PostgreSQL、SQLite 等,使得你可以轻松切换和适配不同的数据库平台。
- 集成方便:Gorm 可以与其他流行的 Go 框架(如 Gin、Echo 等)无缝集成,使得开发过程更加高效。
安装 Gorm
在开始使用 Gorm 之前,你需要先安装它。你可以通过在终端中运行以下命令来安装 Gorm:
go get -u gorm.io/gorm
连接数据库
- 启动数据库
在开始数据库操作之前你需要先连接到数据库,这里实用docker启动postgresql,启动配置的docker-compose.yaml配置如下:
version: '3.8'services:postgresql:image: bitnami/postgresql:latestcontainer_name: postgresqlrestart: unless-stoppedenvironment:# 必需:设置 PostgreSQL 的超级用户密码- POSTGRESQL_PASSWORD=andrew# 可选:设置其他配置- POSTGRESQL_USERNAME=andrew- POSTGRESQL_DATABASE=dbdata- POSTGRESQL_POSTGRES_PASSWORD=andrew # 为 postgres 用户设置密码volumes:# 将主机目录挂载到容器内的持久化路径# 宿主机路径:~/docker/postgresql# 容器内部路径:/bitnami/postgresql- ~/docker/postgresql:/bitnami/postgresqlports:# 映射 PostgreSQL 默认端口(可选)- "5432:5432"# 可选:设置资源限制# deploy:# resources:# limits:# memory: 512M# reservations:# memory: 256M# 可选:健康检查healthcheck:test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"]interval: 10stimeout: 5sretries: 5
然后使用一下命令就可启动 docker-compose up -d
为了方便后期启停,将以上命令封装成如下脚本 start.sh
#!/bin/bash#
# 查看日志
#docker-compose logs -f postgresql# 启动(后台运行)
docker-compose up -d
- 连接数据库
//dsn := "host=192.168.1.102 user=andrew dbname=dbdata password=andrew sslmode=disable TimeZone=Asia/Shanghai"
// postgres 数据库类型
// andrew:andrew 数据库用户名密码和compose的yaml配置中保持一致
// dbdata 数据库名字
dsn := "postgres://andrew:andrew@host:port/dbdata?sslmode=disable"
// 打开数据库连接
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil { log.Fatalf("failed to connect database: %v", err)
} // 测试连接是否成功
sqlDB, _ := db.DB()
err = sqlDB.Ping()
if err != nil { log.Fatalf("could not establish a valid connection: %v", err)
}
log.Println("Connected to the database successfully!")
如果正常,屏幕上会看到如下打印:
2025/08/06 15:58:16 Connected to the database successfully!Process finished with the exit code 0
创建并更新数据库表结构
在完成数据库连接之后,就可以对数据库进行增删改查了,在开始操作数据之前先使用AutoMigrate创建数据表结构
// 根据 Go 的结构体定义,自动创建或更新数据库表结构
db.AutoMigrate(&Product{})
然后就能对数据进行增删改查了
package main import ( "gorm.io/driver/postgres" "gorm.io/gorm" "log") type Product struct { gorm.Model Code string Price uint
} func main() { //dsn := "host=10.168.8.110 user=andrew dbname=dbdata password=andrew sslmode=disable TimeZone=Asia/Shanghai" dsn := "postgres://andrew:andrew@10.168.8.110:5432/dbdata?sslmode=disable" // 打开数据库连接 db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatalf("failed to connect database: %v", err) } // 测试连接是否成功 sqlDB, _ := db.DB() err = sqlDB.Ping() if err != nil { log.Fatalf("could not establish a valid connection: %v", err) } log.Println("Connected to the database successfully!") // Migrate the schema // 根据 Go 的结构体定义,自动创建或更新数据库表结构 db.AutoMigrate(&Product{}) // 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) }
gorm.Model
GORM 提供了一个名为 gorm.Model
的预定义结构体,其中包含常用字段:
type Model struct { // 每条记录的唯一标识符(主键)ID uint `gorm:"primarykey"` // 自动设置为创建记录的当前时间CreatedAt time.Time // 每当记录更新时自动更新到当前时间UpdatedAt time.Time // 用于软删除(将记录标记为已删除但实际上并未将其从数据库中删除)。DeletedAt DeletedAt `gorm:"index"`
}
嵌入到你的结构体中 :你可以将 gorm.Model
直接嵌入到你的结构体中,以自动包含这些字段。这对于维护不同模型之间的一致性以及利用 GORM 的内置约定非常有用,请参阅嵌入式结构体