**# Golang链接MySQL数据库的操作
链接数据库
在链接MySQL数据库之前,我们需要先导入MySQL包
import (
"gorm.io/driver/mysql"
)
在导入gorm.io外部包时,可能出现错误
go get connectex: a connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
当出现此错误时,打开go的环境位置(…\go1.21.0\bin),运行cmd 或 鼠标右键-在终端中打开 输入
go env -w GOPROXY=https://goproxy.cn
回车运行,回到编译器再次同步项目的依赖关系即可解决
示例代码:
package main
import (
"fmt"
"gorm.io/driver/mysql"
)
func main() {
db, err := gorm.Open(
mysql.Open("root:123456@tcp(localhost:3306)/product?charset=utf8mb4"),
&gorm.Config{},
)
if err != nil {
panic("failed to connect database")
}
fmt.Println(db.Name())
}
链接失败提示:
连接成功提示:
接下来我们对代码进行分析
db, err := gorm.Open(
mysql.Open("root:123456@tcp(localhost:3306)/product?charset=utf8mb4"),
&gorm.Config{},
)
//root 为MySQL数据库用户名(可按照自己的配置更换)
//123456 为root账户的密码(按照自己配置更换)
//@tcp 是指通过tcp协议与数据库连接
//(localhost:3306) 是数据库地址以及端口(按照自己配置更换)
//product 为连接数据库的库名
//?以后的为指定的文件编码及其它指定(可选)
对数据库操作
在数据库操作之前,需要先行加入外部包
"gorm.io/gorm"
下面将对数据库的基本操作进行介绍:
此文章的数据库结构如下:
在如下代码中,使用Price表示cost字段,使用gorm可以配置主键、字段、默认值等,例如gorm:"default:D00"
type Product struct {
ID uint `gorm:"primarykey"`
Code string `gorm:"column:code"`
Price uint `gorm:"column:cost"`
}
增加条目
//增添一个条目(ID=1,Code=D42,price=6)
p := &Product{ID: 1, Code: "D42", Price: 6}
res := db.Create(p)
//输出错误,若无错误则为<nil>
fmt.Println(res.Error)
//输出增添条目的ID
fmt.Println(p.ID)
//增添多个条目(ID=2,Code=D41,price=5)(ID=3,Code=D42,price=8)(ID=4,Code=D43,price=0)
products := []*Product{{ID: 2, Code: "D41", Price: 5}, {ID: 3, Code: "D42", Price: 8}, {ID: 4, Code: "D43"}}
res = db.Create(products)
fmt.Println(res.Error)
//输出增添条目的ID
for _, p := range products {
fmt.Println(p.ID)
}
c := &Product{Code: "D48", ID: 5}
//使用clause.OnConflict控制冲突解决,当没有发生错误时执行后面操作,当发生错误时什么也不做
//When err have accured then do noting,else do Create
db.Clauses(clause.OnConflict{DoNothing: true}).Create(&c)
此段代码执行结果为:
查询操作
//获取第一条记录
u := &Product{}
over := db.First(u)
//输出得到的记录数
fmt.Println(over.RowsAffected)
//查询多条数据时,需要一个数组来保存得到的结果
products := make([]*Product, 0)
//select * from products where cost >3
result := db.Where("cost>3").Find(&products)
fmt.Println(result.RowsAffected)
fmt.Println(result.Error)
//输出的为其找到符合where条件的所有条目的地址
fmt.Println(products)
//select * from products where Code=48 AND price=0
result = db.Where(&Product{Code: "D48", Price: 0}).Find(&products)
fmt.Println(result.RowsAffected)
fmt.Println(result.Error)
//select * from products where Code=D42 AND cost>4
result = db.Where("Code=? AND cost>4", "D42").Find(&products)
fmt.Println(result.RowsAffected)
fmt.Println(result.Error)
//select * from products where Code=D41 AND Cost=5
result = db.Where(map[string]interface{}{"Code": "D41", "cost": 5}).Find(&products)
fmt.Println(result.RowsAffected)
fmt.Println(result.Error)
在上述增添结果下的查询执行结果
更新条目
//update products set code='D50',update_at='2023-8-11 17:17:50' where cost>7;
update := db.Model(&Product{}).Where("cost>?", 7).Update("Code", "D50")
fmt.Println(update.Error)
//update products set Code="D51",cost=12,update_at='2023-8-11 17:17:50' where id=4
update = db.Model(&Product{ID: 4}).Updates(map[string]interface{}{"Code": "D51", "cost": 12})
fmt.Println(update.Error)
//only update select field
//update products set Code='D55',update_at='2023-8-11 17:17:50' where id=2
update = db.Model(&Product{ID: 2}).Select("Code").Updates(map[string]interface{}{"Code": "D55", "cost": 10})
fmt.Println(update.Error)
//update products set cost=cost*2+5, update_at='2023-8-11 17:17:50' where id=1
update = db.Model(&Product{ID: 1}).Update("cost", gorm.Expr("cost*?+?", 2, 5))
fmt.Println(update.Error)
执行结果为未报错
在执行后数据库数据条目变为:
删除条目
//delete from products where id=6
delete1 := db.Delete(&Product{}, 5)
fmt.Println(delete1.Error)
//delete from products where id in(1,2,3)
delete1 = db.Delete(&Product{}, []int{1, 2, 3})
fmt.Println(delete1.Error)
//delete from products where Code LIKE %50%
delete1 = db.Where("Code LIKE ?", "%51%").Delete(Product{})
fmt.Println(delete1.Error)
执行结果:未出错
数据库变为空**