下载mysql驱动
go get gorm.io/driver/mysql
go get gorm.io/gorm
创建test.go文件
连接mysql并创建表
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
)
// 初始化mysql连接
var DB *gorm.DB
func init() {
username := "root" //账号
password := "root" //密码
host := "127.0.0.1" //数据库地址,可以是Ip或者域名
port := 3306 //数据库端口
Dbname := "dmg" //数据库名
timeout := "10s" //连接超时,10秒
// root:root@tcp(127.0.0.1:3306)/dmg?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s",
username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
NamingStrategy: schema.NamingStrategy{
TablePrefix: "", // 表名前缀
SingularTable: true, // 单数表名 true 不会生成s
NoLowerCase: false, // 关闭小写转换
},
})
if err != nil {
panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
fmt.Println(db)
DB = db
}
// 创建结构体
type User struct {
Id int
Name string
Age int
}
func main() {
//根据对象 创建表
DB.AutoMigrate(&User{})
}
启动项目之后,发现生成了表
打印日志,调用DB.Debug().xxx方法,就能打印日志
定义模型
// 创建结构体
type User struct {
//默认使用主键作为主键
Id int
//定义mysql的数据库表字段类型和注释
Name string `gorm:"type:varchar(20);comment:姓名"`
Age int `gorm:"comment:年龄"`
}
执行之后,可以发现类型和注释都发生了变化
插入表数据
单表插入数据和批量插入数据
func main() {
u1 := User{
Name: "张三",
Age: 20,
}
//添加表数据
err := DB.Create(&u1).Error
//如果err为nil 表示插入成功
fmt.Println(err)
//添加切片 数组 批量插入数据
var list []User
for i := 0; i < 5; i++ {
list = append(list, User{
Name: fmt.Sprintf("李四:%d", i),
Age: i,
})
}
err1 := DB.Create(&list).Error
fmt.Println(err1)
}
单表查询
func main() {
u1 := User{}
//获取第一个元素的数据 必须是指针类型
DB.Debug().Take(&u1)
fmt.Println(u1)
fmt.Println("-------------------------")
//根据id=12 查询
//对象必须重新定义 否则就会把上一个数据的结果带上
u2 := User{}
DB.Debug().Find(&u2, 12)
fmt.Println(u2)
fmt.Println("-------------------------")
//根据name查询数据
u3 := User{}
//这里记得加单引号 否则查询为空
DB.Debug().Find(&u3, "name='李四:2'")
fmt.Println(u3)
fmt.Println("-------------------------")
//根据主键列表查询
var list1 []User
DB.Debug().Find(&list1, []int{11, 12, 13})
for _, u := range list1 {
fmt.Println(u)
}
fmt.Println("-------------------------")
//根据name in 查询
var list2 []User
DB.Debug().Find(&list2, "name in ?", []string{"李四:3", "李四:4"})
for _, u := range list2 {
fmt.Println(u)
}
}
单表修改
根据id 修改name和age的数据
func main() {
u1 := User{}
u1.Id = 14
u1.Name = "王五"
u1.Age = 66
//根据id 修改name和age的数据
DB.Debug().Save(&u1)
}
查询age=66的所有数据 然后修改name为小刘
func main() {
var list []User
//查询age=66的所有数据 然后修改name为小刘
DB.Debug().Find(&list, "age", 66).Update("name", "小刘")
}
单表删除
func main() {
var list []User
//根据id切片数组 删除多条数据
DB.Debug().Delete(list, []int{14, 15})
}