What is GORM?
GORM是一个go语言开发的ORM框架,ORM全称是Object-Relationship-Mapping,像Java中经常用到的MyBatis就是一个ORM框架,而GORM也是一样,大大降低了对开发人员的sql语句能力,开发人员只需要调用框架中的api即可,剩下的由GORM框架将代码转换成SQL语句后,对数据库进行操作。
其优点是大大简化了程序员工作,提高了开发效率,缺点是在性能优化方面有些许不足。
How to use
需要下载依赖,命令如下
go get -u github.com/jinzhu/gorm
go get github.com/jinzhu/gorm/dialects/mysql@v1.9.16
看到以下信息说明依赖下载成功
由于我不想搞乱我电脑上原有的环境,所以在hyper-v的centos里装了一个docker版的mysql(不知道编译安装为什么编译失败)
命令的意思是运行docker的镜像mysql8019 映射容器的3306端口到宿主机的13306端口,mysql的用户名是root密码是1234,运行docker ps出现下图所示,即安装成功
连接到MySQL
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"time"
)
func main() {
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
//dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
db, err := gorm.Open(mysql.New(mysql.Config{
DSN: "root:1234@tcp(11.8.1.8:13306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
DefaultStringSize: 256, // string 类型字段的默认长度
DisableDatetimePrecision: true, // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
DontSupportRenameIndex: true, // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
DontSupportRenameColumn: true, // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
}), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// ----------------------------数据库连接池----------------------------
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量。
sqlDB.SetMaxOpenConns(100)
// SetConnMaxLifetime 设置了连接可复用的最大时间。
sqlDB.SetConnMaxLifetime(time.Hour)
fmt.Println("success to link mysql")
select {}
}
定义数据库表结构对应的数据结构
表结构
CREATE TABLE `test` (
`id` bigint(20) NOT NULL,
`name` varchar(5) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
对应struct代码
type Test struct {
ID int64 `gorm:"type:bigint(20);column:id;primary_key"`
Name string `gorm:"type:varchar(5);column:name"`
Age int `gorm:"type:int(11);column:age"`
}
CRUD
C
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Create(test)
D
test := &Test{
ID:3,
Name:"jackie",
Age:18,
}
db.Delete(test)
U
test := &Test{
ID: 3,
Name: "hello",
Age: 18,
}
db.Model(&test).Update("name", "world")
R
var testResult Test
db.Where("name = ?", "hello").First(&testResult)
fmt.Println("result: ", testResult)