gorm入门(1)

下载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})
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gorm scopes是Golang中使用的一种功能,用定义和应用查询作用域。它可以帮助我们在查询数据库时,根据不同的条件和需求,动态地构建查询语句。 使用gorm scopes,我们可以将一组查询条件封装成一个作用域(scope),然后在需要的时候应用到查询中。这样可以使代码更加模块化和可复用,同时也能提高查询的灵活性和可读性。 在gorm中,我们可以通过定义结构体的方法来创建作用域。这些方法需要接收一个gorm.DB类型的参数,并返回一个gorm.DB类型的结果。在方法内部,我们可以使用gorm提供的各种查询方法来构建查询条件,例如Where、Order、Limit等。 下面是一个使用gorm scopes的示例: ```go type User struct { ID uint Name string Age int } func (db *gorm.DB) AgeGreaterThan(age int) *gorm.DB { return db.Where("age > ?", age) } func main() { db, err := gorm.Open("mysql", "user:password@tcp(localhost:3306)/database") if err != nil { panic(err) } defer db.Close() var users []User db.Scopes(db.AgeGreaterThan(18)).Find(&users) } ``` 在上面的示例中,我们定义了一个名为AgeGreaterThan的作用域,它接收一个年龄参数,并返回一个添加了查询条件的gorm.DB对象。然后,在main函数中,我们通过调用Scopes方法并传入AgeGreaterThan作用域,来应用该作用域到查询中。 这样,最终执行的查询语句将会是`SELECT * FROM users WHERE age > 18`,并将结果存储到users变量中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值