go-数据库基本操作

1. 配置数据库

bash 复制代码
package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)
#配置表结构
type User struct {
	ID       int64 `json:"id" gorm:"primary_key"` // 主键ID自增长
	Username string
	Password string
}
#配置连接接信息
func main() {
	//
	dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	// err == nil 说明 连接成功
	if err != nil {
		panic("连接数据库失败")
	}
	}

2.创建表

go 复制代码
func main() {
	//
	dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	// err == nil 说明 连接成功
	if err != nil {
		panic("连接数据库失败")
	}
	// 1.自动创建表
	db.AutoMigrate(&User{})

3.增加数据

go 复制代码
			db.Create(&User{
				Username: "lisi",
				Password: "123456",
			})

4.查询数据

go 复制代码
		//4.查询
		//单个查询
		u := User{ID: 1}
		db.First(&u) //过滤其中一条
		fmt.Printf("%#v\n", u)
		// 查询所有数据
		users := []User{}          // 创建一个切片
		db.Find(&users)            // 查询并将结果填充到 users 切片中
		fmt.Printf("%#v\n", users) // 使用 %#v 格式化动词打印 users 切片的内容,包括类型信息和值

5.删除数据

bash 复制代码
	//5.删除
	// db.Delete(&User{ID: 2}) // 根据主见 删除 id 为 2 的用户
	// 条件删除
	db.Where("username = ?", "lisi").Delete(&User{})

6.创建一对多数据表

go 复制代码
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 2.定义一个User表
type User struct {
	gorm.Model
	Username string `json:"username" gorm:"column:username"`
	//添加外键关联
	CreditCards []CreditCard
}

// 3.定义一个card表
type CreditCard struct {
	gorm.Model // gorm.Model包含了ID,CreatedAt,UpdatedAt,DeletedAt
	Number     string
	UserID     uint //这个就是与User表进行关联的外键 结构体+主键就是表关联的外键
}

func main() {
	// 1. 连接数据库
	dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	fmt.Println(db)
	db.AutoMigrate(User{}, CreditCard{}) //自动创建表结构
6.1 创建一对多数据

创建了一个zhangfan用户并插入两条数据

go 复制代码
		user := User{
			Username: "zhangfan",
			CreditCards: []CreditCard{ // 创建一个切片
				{Number: "0001"},
				{Number: "0002"},
			},
		}
		db.Create(&user)
6.1 插入一对多数据
go 复制代码
	//给zhangfan添加一条信用卡数据
	u := User{Username: "zhangfan"}
	db.First(&u)
	db.Model(&u).Association("CreditCards").Append(&CreditCard{Number: "0003"})
6.2 一对多数据关联查询

查询两次

go 复制代码
	// 查询关联数据,先查到用户,在根据用户ID查询关联的card数据
	u := User{Username: "zhangfan"}
	db.First(&u)  //查询user表的数据
	fmt.Printf("%#v\n", u.Username)
	err := db.Model(&u).Association("CreditCards").Find(&u.CreditCards)
	if err != nil {
		fmt.Println(err, "err")
	}
	//fmt.Println(u)
	strUser, _ := json.Marshal(&u)
	fmt.Println(string(strUser))

一次性查找

go 复制代码
	//预加载查询 通过 preload方法一对多查询
	users := []User{}
	db.Preload("CreditCards").Find(&users)
	strUser, _ := json.Marshal(&users)
	fmt.Println(string(strUser))
}

6.创建多对多数据表操作

go 复制代码
package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

func main() {
	// 1. 连接数据库
	dsn := "root:zhangfan@123@tcp(127.0.0.1:3306)/test_db?charset=utf8mb4&parseTime=True&loc=Local"
	db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	fmt.Println(db)
	// 创建表
	db.AutoMigrate(user{}, Language{})

}
// 定义多对多表结构
type user struct {
	gorm.Model
	Language []Language `gorm:"many2many:user_languages;"` // 定义多对多关系
}
type Language struct {
	gorm.Model
	Name string
}
相关推荐
笃行3504 小时前
数据库性能优化的五处内核改造,KingbaseES 配了四件诊断工具
数据库
非优秀程序员6 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
沐晓时光7 小时前
C语言入门,内存函数知识讲解
c语言·开发语言
SelectDB11 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶11 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
David猪大卫13 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
这个DBA有点耶14 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风14 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio14 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
fengci.15 小时前
CTF2MISC中等部分
开发语言·前端·学习