这节课主要学习了Go 框架三件套详解(Web/RPC/ORM),并使用 GORM (Go 的 ORM 库) 连接数据库,实现了增删改查操作,把实现过程整理成此文。
ORM
ORM 是 "Object-Relational Mapping" 的缩写,意为对象关系映射。它是一种将面向对象编程语言(如Java、Python、C#等)中的对象模型和关系型数据库中的数据模型进行映射的技术。通过使用 ORM,开发者可以通过面向对象的方式来操作数据库,而不需要直接编写SQL语句。
ORM 的主要目标是解决面向对象和关系型数据库之间的不匹配问题。在传统的关系型数据库中,数据以表格的形式存储,而在面向对象编程中,数据是以对象的形式组织的。ORM 提供了一种映射机制,将对象和表之间进行转换,从而让开发者可以使用面向对象的方式来处理数据库操作。
GORM
GORMGORM 是一个社区活跃、受欢迎的 Go ORM 库,它可以极大地简化数据库操作的开发工作,同时提供了丰富的特性来处理各种数据库需求。官方文档:中文官方网站
基本使用
gorm的默认约定:gorm的使用名为ID的字段作为逐渐,如果没有就用结构体的蛇形负数作为表名,字段名的蛇形作为列名。使用CreatedAt,UpdatedAt字段作为创建,更新时间。
步骤一般是:定义gorm model,为model定义表名,连接数据库,创建数据,查询数据,更新数据,删除数据。
GORM 目前支持 MySQL、SQLServer、PostgreSQL、SQLite。
安装
go get -u github.com/jinzhu/gorm
连接数据库
GORM 目前支持 MySQL、SQLServer、PostgreSQL、SQLite。 连接不同的数据库都需要导入对应数据的驱动程序,这里以连接MySQL为例。
import _ "github.com/jinzhu/gorm/dialects/mysql"
// import _ "github.com/jinzhu/gorm/dialects/postgres"
// import _ "github.com/jinzhu/gorm/dialects/sqlite"
// import _ "github.com/jinzhu/gorm/dialects/mssql"
连接MySQL
import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func main() {
db, err := gorm.Open("mysql", "user:password@(localhost)/dbname?charset=utf8mb4&parseTime=True&loc=Local")
defer db.Close()
}
GORM操作MySQL
使用GORM连接db1进行创建、查询、更新、删除操作。
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
// UserInfo 用户信息
type UserInfo struct {
ID uint
Name string
Gender string
Hobby string
}
func main() {
db, err := gorm.Open("mysql", "root:cn0810@(192.168.1.118:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
if err!= nil{
panic(err)
}
defer db.Close()
// 自动迁移,创建表(把结构体和数据表进行对应)
db.AutoMigrate(&UserInfo{})
//创建数据行
u1 := UserInfo{1, "小丽", "女", "乒乓球"}
u2 := UserInfo{2, "小海", "男", "足球"}
// 创建记录
db.Create(&u1)
db.Create(&u2)
// 查询
var u = new(UserInfo)
db.First(u)
fmt.Printf("%#v\n", u)
var uu UserInfo
db.Find(&uu, "hobby=?", "足球")
fmt.Printf("%#v\n", uu)
// 更新
db.Model(&u).Update("hobby", "篮球")
// 删除
db.Delete(&u)
}
DSN是什么?
DSN(Data Source Name)是用于指定数据库连接信息的格式化字符串,通常用于应用程序连接到数据库。DSN包含了连接数据库所需的信息,如数据库类型、主机地址、端口号、用户名、密码等。
不同类型的数据库可能有不同的DSN格式。对应这里的""root:cn0810@(192.168.1.118:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local""
遇到的问题及解决方式
-
MySQL的配置问题,是我在之前装MySQL后就没注意的一个环境变量的问题。通过解决mysql不是内部或外部命令_鲸鱼编程pyhui的博客-CSDN博客配置成功。
-
Goland里面引入第三方库的问题,通过Go构建项目的时候,解决missing go.sum entry for module providing package <package_name>_junlz0413的博客-CSDN博客成功解决。
-
Goland和gorm的连接问题。
"root:cn0810@(192.168.1.118:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local"
是连接的关键,但是确认各个要素都没问题后,还是显示
panic: Error 1130: Host 'DESKTOP-3T1GS1V' is not allowed to connect to this MySQL server,
MySQL 数据库的访问权限问题。 在网络查找无果后,gpt给了我解决方案,使用下面代码授权成功。
CREATE USER 'your_username'@'DESKTOP-3T1GS1V' IDENTIFIED WITH 'mysql_native_password' BY 'your_password';
GRANT ALL PRIVILEGES ON *.* TO 'your_username'@'DESKTOP-3T1GS1V';
FLUSH PRIVILEGES;
注意:
请将 'your_username'、'DESKTOP-3T1GS1V' 和 'your_password' 替换为你的实际用户名、主机和密码。
总结
在本节课,我学习了Go 框架三件套详解(Web/RPC/ORM),并使用 GORM (Go 的 ORM 库) 连接数据库,实现了增删改查操作,把实现过程整理成此文。当然,这只是gorm最基础的操作,但实践的时候也会遇到很多问题,因此,我还是得多敲代码,多实践,才能真正有收获。之后也还有更复杂的操作需要实践,加油。