|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#mysql driver
|
|
|
|
|
|
go get -u github.com/go-sql-driver/mysql
|
|
|
|
|
|
#uuid
|
|
|
|
|
|
go get github.com/google/uuid
|
|
|
|
|
|
#gorm
|
|
|
|
|
|
go get -u gorm.io/gorm
|
|
|
|
|
|
#gorm mysql driver
|
|
|
|
|
|
go get -u gorm.io/driver/mysql
|
|
|
|
|
|
#获取随机数
|
|
|
|
|
|
go get -u github.com/shopspring/decimal
|
|
|
|
|
|
#mqtt包
|
|
|
|
|
|
go get -u github.com/eclipse/paho.mqtt.golang
|
|
|
|
|
|
#oracle驱动
|
|
|
|
|
|
#go get -u github.com/godror/godror
|
|
|
|
|
|
#go get -u github.com/dzwvip/oracle
|
|
|
|
|
|
|
|
|
|
|
|
#go get xorm.io/xorm
|
|
|
|
|
|
#go get github.com/go-xorm/xorm
|
|
|
|
|
|
|
|
|
|
|
|
#GORM 使用指南
|
|
|
|
|
|
#https://blog.csdn.net/qq_21484461/article/details/138588619
|
|
|
|
|
|
#gorm github
|
|
|
|
|
|
#https://github.com/go-gorm/gorm?tab=readme-ov-file
|
|
|
|
|
|
#gorm 使用文档
|
|
|
|
|
|
#https://gorm.io/zh_CN/docs/index.html
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#1. 介绍
|
|
|
|
|
|
#GORM(Go Object Relational Mapper)是一个用于 Go 语言的 ORM 库,
|
|
|
|
|
|
#它允许开发者通过面向对象的方式操作数据库,而不必直接编写 SQL 查询语句。
|
|
|
|
|
|
#GORM 提供了简单易用的 API,使得在 Go 项目中进行数据库操作变得更加高效和便捷。
|
|
|
|
|
|
#它的设计理念是将数据库表映射为 Go 的结构体(Struct),并通过方法调用来实现对数据的增删改查等操作,
|
|
|
|
|
|
#从而降低了与数据库交互的复杂性。
|
|
|
|
|
|
|
|
|
|
|
|
#1.2 GORM 的历史和背景
|
|
|
|
|
|
#GORM 最初由 Jinzhu(原名:Liao Xingchang) 在 2013 年创建,并于同年开源发布在 GitHub 上。起初,GORM 是为了解决 Go 语言中缺乏成熟 ORM 库的问题而诞生的。随着 Go 语言的流行和生态系统的不断发展,GORM 逐渐成为了 Go 社区中最受欢迎的 ORM 库之一。
|
|
|
|
|
|
#
|
|
|
|
|
|
#经过多年的发展,GORM 不断完善和更新,增加了许多功能和优化,同时也受到了全球范围内开发者的广泛关注和使用。截至目前,GORM 的 GitHub 仓库已经获得了数万颗星星,并且被众多知名的开源项目和商业项目所采用和推荐。
|
|
|
|
|
|
#
|
|
|
|
|
|
#1.3 为什么选择 GORM?
|
|
|
|
|
|
#选择 GORM 作为数据库操作工具的原因有以下几点:
|
|
|
|
|
|
#
|
|
|
|
|
|
#简单易用:GORM 提供了简洁的 API,使得开发者能够用最少的代码完成数据库操作,降低了学习成本和开发成本。
|
|
|
|
|
|
#
|
|
|
|
|
|
#功能丰富:GORM 支持丰富的数据库操作功能,包括基本的 CRUD 操作、事务管理、关联查询等,满足了大部分应用场景的需求。
|
|
|
|
|
|
#
|
|
|
|
|
|
#灵活性:GORM 提供了丰富的配置选项和扩展接口,可以灵活地适应不同的项目需求和数据库类型。
|
|
|
|
|
|
#
|
|
|
|
|
|
#社区支持:作为一个活跃的开源项目,GORM 拥有庞大的社区支持和活跃的开发团队,能够及时解决问题并提供技术支持。
|
|
|
|
|
|
#
|
|
|
|
|
|
#性能优化:GORM 在设计和实现上对性能进行了优化,同时提供了一些性能调优的建议和工具,可以帮助开发者提升应用程序的性能表现。
|
|
|
|
|
|
#
|
|
|
|
|
|
#生态完善:GORM 作为一个成熟的 ORM 库,已经在 Go 生态系统中建立了良好的地位,与其他常用的库和框架(如 Gin、Echo 等)集成良好,能够为开发者提供更加完整的解决方案。
|
|
|
|
|
|
#
|
|
|
|
|
|
#综上所述,GORM 是一个功能强大、易于使用且受到广泛认可的 ORM 库,适用于各种规模的 Go 项目,并且能够帮助开发者提高开发效率和代码质量。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#2. 安装与配置
|
|
|
|
|
|
#2.1 安装 GORM
|
|
|
|
|
|
#安装 GORM 可以通过 Go 的包管理工具 go get 来完成。假设你已经安装了 Go 环境,执行以下命令即可安装 GORM:
|
|
|
|
|
|
#
|
|
|
|
|
|
#go get -u github.com/go-gorm/gorm
|
|
|
|
|
|
#1
|
|
|
|
|
|
#这条命令会将 GORM 库下载并安装到你的 $GOPATH 下的 src 目录中。
|
|
|
|
|
|
|
|
|
|
|
|
#2.2 配置数据库连接
|
|
|
|
|
|
#在使用 GORM 之前,你需要配置数据库连接信息,包括数据库类型、连接地址、用户名、密码等。GORM 支持多种数据库,常用的包括 MySQL、PostgreSQL、SQLite、SQL Server 等。
|
|
|
|
|
|
#
|
|
|
|
|
|
#以下是一个示例配置 MySQL 数据库连接的代码:
|
|
|
|
|
|
|
|
|
|
|
|
#import (
|
|
|
|
|
|
# "gorm.io/driver/mysql"
|
|
|
|
|
|
# "gorm.io/gorm"
|
|
|
|
|
|
#)
|
|
|
|
|
|
#
|
|
|
|
|
|
#func main() {
|
|
|
|
|
|
# dsn := "user: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")
|
|
|
|
|
|
# }
|
|
|
|
|
|
#
|
|
|
|
|
|
# // 在这里使用 db 进行数据库操作
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#其中,dsn 是数据源名称,包含了数据库的连接信息,格式为 "用户名:密码@tcp(数据库地址:端口号)/数据库名称?参数"。具体的参数说明如下:
|
|
|
|
|
|
#
|
|
|
|
|
|
#charset=utf8mb4:设置字符集为 UTF-8。
|
|
|
|
|
|
#parseTime=True:自动解析数据库中的时间字段为 Go 的时间类型。
|
|
|
|
|
|
#loc=Local:设置时区为本地时区。
|
|
|
|
|
|
#你需要将示例代码中的 user、password、dbname 替换为你自己的数据库用户名、密码和数据库名称,并根据需要修改数据库地址和端口号。
|
|
|
|
|
|
|
|
|
|
|
|
#2.3 初始化 GORM
|
|
|
|
|
|
#在连接数据库之后,你需要初始化 GORM 的数据库连接,以便后续进行数据库操作。通常情况下,你只需要在程序启动时进行一次初始化操作即可。
|
|
|
|
|
|
#
|
|
|
|
|
|
#以下是初始化 GORM 的示例代码:
|
|
|
|
|
|
#
|
|
|
|
|
|
#import (
|
|
|
|
|
|
# "gorm.io/gorm"
|
|
|
|
|
|
# "gorm.io/driver/mysql"
|
|
|
|
|
|
#)
|
|
|
|
|
|
#
|
|
|
|
|
|
#var DB *gorm.DB
|
|
|
|
|
|
#
|
|
|
|
|
|
#func InitDB() {
|
|
|
|
|
|
# dsn := "user: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")
|
|
|
|
|
|
# }
|
|
|
|
|
|
#
|
|
|
|
|
|
# DB = db
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#在这个示例中,我们将初始化操作封装在了一个名为 InitDB() 的函数中,
|
|
|
|
|
|
#并将初始化后的数据库连接赋值给了全局变量 DB,以便在程序的其他地方进行使用。
|
|
|
|
|
|
#你可以根据自己的项目需求,将初始化操作放在适当的位置,并根据需要进行调整。
|
|
|
|
|
|
|
|
|
|
|
|
#3. 模型定义
|
|
|
|
|
|
#在 GORM 中,模型定义是指将数据库表映射为 Go 的结构体(Struct),通过结构体的字段来表示数据库表的字段,
|
|
|
|
|
|
#并使用 GORM 提供的标签来指定字段的属性和约束。
|
|
|
|
|
|
#同时,通过在结构体之间建立关联关系,可以实现数据库表之间的关联查询和操作。
|
|
|
|
|
|
#
|
|
|
|
|
|
#3.1 创建模型结构体
|
|
|
|
|
|
#下面是一个示例,展示了如何使用 GORM 创建一个简单的模型结构体:
|
|
|
|
|
|
#
|
|
|
|
|
|
#import "gorm.io/gorm"
|
|
|
|
|
|
#
|
|
|
|
|
|
#type User struct {
|
|
|
|
|
|
# gorm.Model // 内置模型结构体,包含 ID、CreatedAt、UpdatedAt、DeletedAt 字段
|
|
|
|
|
|
#
|
|
|
|
|
|
# Name string
|
|
|
|
|
|
# Age int
|
|
|
|
|
|
# Email string `gorm:"unique"` // 使用标签指定字段属性,这里表示 Email 字段在数据库中是唯一的
|
|
|
|
|
|
# Address string
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#
|
|
|
|
|
|
#在这个示例中,我们创建了一个名为 User 的结构体,用于表示数据库中的用户表。
|
|
|
|
|
|
#User 结构体包含了 gorm.Model 结构体,这是 GORM 提供的一个内置模型结构体,
|
|
|
|
|
|
#包含了一些常用的字段,如 ID、CreatedAt、UpdatedAt、DeletedAt,
|
|
|
|
|
|
#用于记录记录的主键、创建时间、更新时间和软删除状态。
|
|
|
|
|
|
#
|
|
|
|
|
|
#除了内置模型字段外,我们还定义了 Name、Age、Email 和 Address 字段,
|
|
|
|
|
|
#分别表示用户的姓名、年龄、邮箱和地址。这些字段与数据库表的字段一一对应,用于存储用户的信息。
|
|
|
|
|
|
#
|
|
|
|
|
|
#3.2 模型字段标签解析
|
|
|
|
|
|
#在模型定义中,我们可以通过在字段上添加标签来指定字段的属性和约束。常用的标签包括:
|
|
|
|
|
|
#
|
|
|
|
|
|
#gorm:"column:column_name":指定字段在数据库中的列名。
|
|
|
|
|
|
#gorm:"primaryKey":指定字段为主键。
|
|
|
|
|
|
#gorm:"autoIncrement":指定字段为自增长。
|
|
|
|
|
|
#gorm:"unique":指定字段在数据库中唯一。
|
|
|
|
|
|
#gorm:"not null":指定字段不能为空。
|
|
|
|
|
|
#gorm:"default:value":指定字段的默认值。
|
|
|
|
|
|
#gorm:"size:length":指定字段的长度。
|
|
|
|
|
|
#gorm:"index":指定字段创建索引。
|
|
|
|
|
|
#下面是一个示例,展示了如何在模型字段上添加标签:
|
|
|
|
|
|
#
|
|
|
|
|
|
#type Product struct {
|
|
|
|
|
|
# ID uint `gorm:"primaryKey;autoIncrement"`
|
|
|
|
|
|
# Name string `gorm:"size:255;not null"`
|
|
|
|
|
|
# Price float64
|
|
|
|
|
|
# Category string `gorm:"index"`
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#在这个示例中,我们定义了一个名为 Product 的结构体,用于表示数据库中的产品表。
|
|
|
|
|
|
#Product 结构体包含了 ID、Name、Price 和 Category 字段,
|
|
|
|
|
|
#分别表示产品的编号、名称、价格和类别。其中,ID 字段通过 primaryKey 和 autoIncrement
|
|
|
|
|
|
#标签指定为主键并自增长,Name 字段通过 size 和 not null 标签指定了字段的长度和不能为空,
|
|
|
|
|
|
#Category 字段通过 index 标签为字段创建了索引。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#3.3 模型关联关系
|
|
|
|
|
|
#在 GORM 中,可以通过在模型结构体中建立字段关联来表示数据库表之间的关联关系,常见的关联关系包括一对一、一对多和多对多。以下是一个示例,展示了如何在模型中定义关联关系:
|
|
|
|
|
|
#
|
|
|
|
|
|
#type Order struct {
|
|
|
|
|
|
# ID uint
|
|
|
|
|
|
# OrderNumber string
|
|
|
|
|
|
# TotalAmount float64
|
|
|
|
|
|
# UserID uint // 外键
|
|
|
|
|
|
#
|
|
|
|
|
|
# User User `gorm:"foreignKey:UserID"` // 一对一关联,通过 UserID 外键关联到 User 结构体
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#type User struct {
|
|
|
|
|
|
# ID uint
|
|
|
|
|
|
# Name string
|
|
|
|
|
|
# Email string
|
|
|
|
|
|
# Order Order // 一对一关联,一个用户对应一个订单
|
|
|
|
|
|
#}
|
|
|
|
|
|
#
|
|
|
|
|
|
#在这个示例中,我们定义了两个结构体 Order 和 User,分别表示数据库中的订单表和用户表。
|
|
|
|
|
|
#在 Order 结构体中,我们使用了 UserID 字段作为外键,
|
|
|
|
|
|
#关联到了 User 结构体,通过 gorm:"foreignKey:UserID" 标签指定了外键关联的字段。
|
|
|
|
|
|
#在 User 结构体中,我们定义了一个名为 Order 的字段,用于表示与用户关联的订单信息。
|
|
|
|
|
|
#这样,我们就建立了订单表和用户表之间的一对一关联关系。
|
|
|
|
|
|
#
|
|
|
|
|
|
#除了一对一关联关系外,GORM 还支持一对多和多对多等其他类型的关联关系,
|
|
|
|
|
|
#开发者可以根据实际需求选择合适的关联关系来设计模型。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#准备工作:安装 Oracle 驱动
|
|
|
|
|
|
#GORM 社区支持通过 godror 作为 Oracle 驱动。我们使用第三方库 github.com/godror/godror 和 github.com/dzwvip/oracle 来桥接 GORM 与 Oracle。
|
|
|
|
|
|
#
|
|
|
|
|
|
#1. 安装驱动
|
|
|
|
|
|
#go get -u github.com/godror/godror
|
|
|
|
|
|
#go get -u github.com/dzwvip/oracle
|
|
|
|
|
|
#2. 安装 Oracle 客户端依赖(非必须,但推荐)
|
|
|
|
|
|
#下载 Oracle Instant Client 并配置环境变量(适用于 Linux/macOS):
|
|
|
|
|
|
#
|
|
|
|
|
|
#export LD_LIBRARY_PATH=/your/path/instantclient_21_1:$LD_LIBRARY_PATH
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#配置 DSN(连接字符串)
|
|
|
|
|
|
#Oracle 的 DSN 格式如下:
|
|
|
|
|
|
#
|
|
|
|
|
|
#user/password@host:port/service_name
|
|
|
|
|
|
#例如:
|
|
|
|
|
|
#
|
|
|
|
|
|
#dsn := "scott/tiger@localhost:1521/ORCLPDB1"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#编写代码:用 GORM 连接 Oracle 数据库
|
|
|
|
|
|
#package main
|
|
|
|
|
|
#
|
|
|
|
|
|
#import (
|
|
|
|
|
|
# "fmt"
|
|
|
|
|
|
# "gorm.io/gorm"
|
|
|
|
|
|
# "gorm.io/driver/oracle"
|
|
|
|
|
|
#)
|
|
|
|
|
|
#
|
|
|
|
|
|
#func main() {
|
|
|
|
|
|
# dsn := "scott/tiger@localhost:1521/ORCLPDB1"
|
|
|
|
|
|
# db, err := gorm.Open(oracle.Open(dsn), &gorm.Config{})
|
|
|
|
|
|
# if err != nil {
|
|
|
|
|
|
# panic("failed to connect Oracle: " + err.Error())
|
|
|
|
|
|
# }
|
|
|
|
|
|
# fmt.Println(" Oracle connection success!")
|
|
|
|
|
|
#
|
|
|
|
|
|
# // 示例:自动迁移一个表
|
|
|
|
|
|
# type User struct {
|
|
|
|
|
|
# ID int `gorm:"primaryKey"`
|
|
|
|
|
|
# Name string
|
|
|
|
|
|
# }
|
|
|
|
|
|
# db.AutoMigrate(&User{})
|
|
|
|
|
|
#
|
|
|
|
|
|
# // 示例:插入一条数据
|
|
|
|
|
|
# db.Create(&User{Name: "Alice"})
|
|
|
|
|
|
#}
|
|
|
|
|
|
|
|
|
|
|
|
#实战技巧:封装连接方法
|
|
|
|
|
|
#在实际项目中,我们可以将连接逻辑封装起来,方便多环境切换和参数管理:
|
|
|
|
|
|
#
|
|
|
|
|
|
#func InitOracle(dsn string) (*gorm.DB, error) {
|
|
|
|
|
|
# db, err := gorm.Open(oracle.Open(dsn), &gorm.Config{})
|
|
|
|
|
|
# if err != nil {
|
|
|
|
|
|
# return nil, err
|
|
|
|
|
|
# }
|
|
|
|
|
|
# sqlDB, _ := db.DB()
|
|
|
|
|
|
# sqlDB.SetMaxIdleConns(10)
|
|
|
|
|
|
# sqlDB.SetMaxOpenConns(100)
|
|
|
|
|
|
# return db, nil
|
|
|
|
|
|
#}
|