import (
"fmt"
"os"
"gopkg.in/ini.v1"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB *gorm.DB
var err error
func init() {
//读取.ini里面的数据库配置
config, iniErr := ini.Load("./conf/app.ini")
if iniErr != nil {
fmt.Printf("获取配置失败: %v", iniErr)
os.Exit(1)
}
ip := config.Section("mysql").Key("ip").String()
port := config.Section("mysql").Key("port").String()
user := config.Section("mysql").Key("user").String()
password := config.Section("mysql").Key("password").String()
database := config.Section("mysql").Key("database").String()
// dsn := "root:123456@tcp(192.168.0.6:3306)/gin?charset=utf8mb4&parseTime=True&loc=Local"
dsn := fmt.Sprintf("%v:%v@tcp(%v:%v)/%v?charset=utf8mb4&parseTime=True&loc=Local", user, password, ip, port, database)
DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
QueryFields: true, //打印sql
//SkipDefaultTransaction: true, //禁用事务
})
// DB.Debug()
if err != nil {
fmt.Println(err)
}
}
自定义模型控制表名
默认情况表名是名称复数吗, 如果我们的结构体为User{}, 表示这个模型默认操作users表. 如果想修改默认表名称
// 控制user表
func (User) TableName() string{
return "user"
}
增删改查
//查
userList = []User{}
DB.Find(&userList) // 全部数据
DB.where("age > ?", 20).Find(&userList)
//增加数据
user := User{
Username:"张三",
Age:20,
AddTime:1185645842
}
DB.Create(&user)
//修改1
user := User{Id:7}
DB.Find(&user)
user.Age = 18
DB.save(&user)
//修改2-修改指定列
user := User{}
DB.Model(&user).Where("id = ?",5).Update("Username","王丰")
//删除1
user := User{Id:5}
DB.Delete(&user)
//删除2
user := User{}
DB.Where("Id = ?",5).Delete(&user)
Where详情
// 自定义返回json格式
type Nav struct{
Id int `json:"idx"`
Title string `json:"title"`
Url string `json:"url"`
}
navList := []Nav{}
nav := nav{}
//Id大于3的数据
DB.Where("id > ?",3).Find(&navList)
//Id大于3 AND Id小于9
DB.Where("id>3 AND id<9").Find(&navList)
DB.Where("id>? And id<?",3,9).Find(&navList)
//获取id是3,5,6的数据
DB.Where("id In ?", []int{3,5,6}).Find(&navList)
//查询文章标题包含 "有" 的文章
DB.Where("title LIKE ?", "%有%").Find(&navList)
// between AND id在3到30的数据
DB.Where("id between ? and ?",3,30).Find(&navList)
// OR 获取Id=2 或 Id=3的数据
DB.Where("id=? OR id=?",2,3).Find(&navList)
DB.OR()
-------------------------------------------------------------
// Select 拿取指定字段
DB.Select("id,title")
//Count 拿出数量
num := 0
DB.Find(&navList).Count(&num)
Order, Limit, Offset
//排序, 按照顺序正序 id倒序 输出
DB.Order("shunxv asc").Order("id desc").Find(&navList)
//Limit限制条数, 拿出前2条
DB.Order("shunxv asc").Order("id desc").Limit(2).Find(&navList)
//Offset 跳过前2条
DB.Order("shunxv asc").Order("id desc").Offset(2).Find(&navList)
使用原生sql
//删除一条数据
DB.Exec("delete from user where id=?",5)
//修改一条数据
DB.Exec("update user set username='wdf' where id=?",4)
//查询全部(1条)数据
DB.Row("select * from user").Scan(&userList)
//查询user表数据量
num :=0
DB.Row("select * from user").Scan(&num)
多表关联, 结构体关联, 一对一, 一对多
//文章分类表
type ArticleCate struct {
Id int
Title int
Articles []Article `gorm:"foreignKey:CateId"`
}
// 文章表
type Article struct{
Id int
Title string
CateId int //想通过这个关联到文章分类
State int
ArticleCxxx ArticleCate `gorm:"foreignKey:CateId"`
}
//拿数据
articleList := []Article{}
DB.Preload("ArticleCxxx").Find(&articleList)
articleCateList := []ArticleCate{}
DB.Preload("Articles").Find(&articleList)
多对多
//学生表
type Student struct{
Id int
Name string
Number string
//lesson_student是中间表名
Lesson []Lesson `gorm:"many2many:lesson_student;"`
}
//课程表
type Lesson struct{
Id int `json:"id"`
Name string `json:"name"`
//用于查找选修这门课的学生
Student []Student `gorm:"many2many:lesson_student;"`
}
//中间表
type LessonStudent struct{
LessonId int
StudentId int
}
//获取学生选的课程
DB.Preload("Lesson").Find(&studentList)
//查找选修这门课的学生
DB.Preload("Student").Find(&lessonList)
// 查找选修每一门课的学生, 把id为1的学生排除掉
DB.Preload("Student","id != 1").Find(&lessonList)