golang 利用 gorm 链接数据库、增删改查

125 阅读2分钟

golang 利用 gorm 链接数据库、增删改查

package main

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

type Student struct {
    Id       int    `gorm:"primary_key" json:"id"`
    Username string `json:"username"`
    Password string `json:"password"`
}

//type User struct {
//  Id      int64    `gorm:"primary_key" json:"id"`
//  Name     string
//  CreatedAt   *time.Time  `json:"createdAt" gorm:"column:create_at"`
//  Email     string   `gorm:"type:varchar(100);unique_index"`   // 唯一索引
//  Role     string   `gorm:"size:255"`  //设置字段的大小为255个字节
//  MemberNumber  *string   `gorm:"unique;not null"`  // 设置字段唯一且不为空
//  memberNumber
//  Num      int    `gorm:"AUTO_INCREMENT"`    // 设置 Num字段自增
//  Address    string   `gorm:"index:addr"`  // 给Address 创建一个名字是 `addr`的索引
//  IgnoreMe   int     `gorm:"-"`      //忽略这个字段
//}


var db *gorm.DB
var err error

// gorm链接数据库
func initDB() {
    dsn := "root:@tcp(localhost:3306)/godb?charset=utf8mb4&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if err != nil {
       fmt.Println(err)
       return
    } else {
       fmt.Println("链接成功", db)
    }
}

// 利用gorm 自动创建表
func createTable() {
    db.AutoMigrate(
       Student{},
    )
}

// 增
func insertData(username string, password string) {
    db.Create(&Student{
       Username: username,
       Password: password,
    })
}

// 改
func modfiy(id int, name string) {
    db.Model(Student{Id: id}).Update("username", name)
}

// 查
func queryOne(id int) {
    s := Student{Id: id}
    db.First(&s)
    fmt.Println("student====", s)
}

// 查所有数据
func queryAll() {
    stus := []Student{}
    db.Find(&stus)
    fmt.Println(stus)
}

// 删除
func deleteData(id int) {
    db.Delete(&Student{
       Id: id,
    })
    // 条件删
    //db.Where("username = ?","xiaoming").Delete(&Student{})
}

func main() {
    fmt.Println("begin")
    initDB()
    createTable()
    //insertData("xiaoming", "123456") // 增加用户
    //modfiy(1, "xiaohong")
    //queryOne(1)
    deleteData(1)
    queryAll()
}

细节和更多操作:

user := User{}
// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// 获取最后一条记录(主键降序)
db.Last(&user) // 升序下最后一条,降序下第一条,总之跟First相反。
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

// 查询主键为 10 的第一条数据,int和string都无所谓,会自动匹配
db.First(&user, 10)
db.First(&user, "10")

设置查询条件 Where

db.Where("name = ?", "l").First(&user)
// SELECT * FROM users WHERE user_name = 'l' ORDER BY id LIMIT 1;
// 获取全部匹配的记录
db.Where("name <> ?", "l").Find(&users)
// SELECT * FROM users WHERE user_name <> 'l';
// IN
db.Where("name IN ?", []string{"lzq", "qqq"}).Find(&users)
// SELECT * FROM users WHERE user_name IN ('lzq','qqq');
// LIKE
db.Where("name LIKE ?", "%l%").Find(&users)
// SELECT * FROM users WHERE user_name LIKE '%l%';
// AND
db.Where("name = ? AND age = ?", "lzq", "aaa").Find(&users)
// SELECT * FROM users WHERE user_name = 'lzq' AND password = aaa;
// BETWEEN
db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users)
// SELECT * FROM users WHERE created_at BETWEEN '2020-11-01 00:00:00' AND '2020-11-08 00:00:00';

表的删除。

要在 GORM 中删除 "user" 表,可以使用 Migrator 对象的 DropTable 方法。Migrator 对象用于处理数据库的迁移操作,而 DropTable 方法用于删除表。

// 获取 Migrator 对象
    migrator := db.Migrator()
// 删除 "users" 表
if migrator.HasTable(&User{}) {
	migrator.DropTable(&User{})
	fmt.Println("users表删除成功")
} else {
	fmt.Println("users表不存在")
}