GORM连接MySQL实现增删改查(实践文章) | 青训营

229 阅读4分钟

这节课主要学习了Go 框架三件套详解(Web/RPC/ORM),并使用 GORM (Go 的 ORM 库) 连接数据库,实现了增删改查操作,把实现过程整理成此文。

ORM

ORM 是 "Object-Relational Mapping" 的缩写,意为对象关系映射。它是一种将面向对象编程语言(如Java、Python、C#等)中的对象模型和关系型数据库中的数据模型进行映射的技术。通过使用 ORM,开发者可以通过面向对象的方式来操作数据库,而不需要直接编写SQL语句。

ORM 的主要目标是解决面向对象和关系型数据库之间的不匹配问题。在传统的关系型数据库中,数据以表格的形式存储,而在面向对象编程中,数据是以对象的形式组织的。ORM 提供了一种映射机制,将对象和表之间进行转换,从而让开发者可以使用面向对象的方式来处理数据库操作。

GORM

Github 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""

遇到的问题及解决方式

  1. MySQL的配置问题,是我在之前装MySQL后就没注意的一个环境变量的问题。通过解决mysql不是内部或外部命令_鲸鱼编程pyhui的博客-CSDN博客配置成功。

  2. Goland里面引入第三方库的问题,通过Go构建项目的时候,解决missing go.sum entry for module providing package <package_name>_junlz0413的博客-CSDN博客成功解决。

  3. 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最基础的操作,但实践的时候也会遇到很多问题,因此,我还是得多敲代码,多实践,才能真正有收获。之后也还有更复杂的操作需要实践,加油。