Gorm的学习

一、连接

在golang中输入两行代码。

go get gorm.io/driver/mysql

go get gorm.io/gorm

第一个是加载驱动,第二个是加载gorm。

1、连接数据库,第一种方式:

func main() {
db, err := gorm.Open(mysql.Open("root:root@tcp(127.0.0.1:3306)/ginchat?charset=utf8mb4&parseTime=True&loc=Local"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
fmt.Println(db)
}

第二种方式

二、在创建mysql数据库的时候要用

err = DB.Exec("CREATE DATABASE " + dbName).Error

如果是”create database ?“ db_name,会有单引号,语法错误。

三、工作

今天遇到一件离谱的事情,

我一开始是用first,因为我只要查询第一条数据,这个表也只存一条数据,不过后面的判断进去了,但是一直没有生成一条数据。试着试着,将first改为find,又可以创建了。 

result := db.Where("event_name=?", "init").First(&maintainTimes)

 最终这可以。

result := db.Where("event_name=?", "init").Find(&maintainTimes)
	if result.RowsAffected == 0 {
		exists = false
	} else {
		exists = true
	}
	//2.0 存在则判断 当前时间与数据库 存的7天 日期,时间超过了则返回一个true,不是则返回false;判断 当前时间与数据库 存的30天 日期,时间超过了则返回一个true,不是则返回false。
	if exists == false {
		sevenDayLater := now.AddDate(0, 0, 7)
		thirtyDayLater := now.AddDate(0, 0, 30)

		//不存在则创建
		time2 := model.MaintainTime{EventName: "init", SevenDays: sevenDayLater, ThirtyDays: thirtyDayLater}
		result = db.Create(&time2)

下面学习一下find和first的区别

还是先看一下官方文档吧。

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error or nil

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

还是没有找到我出现的问题。

后面了解到:

  1. First 方法

    • First 方法用于查找与查询条件匹配的第一个记录,并将其作为指针传递给指定的变量。
    • 如果没有找到记录,First 会返回 gorm.ErrRecordNotFound 错误,并且 RowsAffected 会是 0。
  2. Find 方法

    • Find 方法用于查找与查询条件匹配的所有记录,并将它们作为切片传递给指定的变量。
    • 如果没有找到记录,Find 不会返回错误,RowsAffected 也会是 0。
  3. RowsAffected 的使用

    • RowsAffected 仅在使用 Find 方法时有效。在 First 方法中,如果记录未找到,RowsAffected 可能不会正确设置。
  4. 错误处理

    • 当使用 First 方法时,您应该首先检查错误,然后根据错误类型来确定记录是否存在。

 应该是我当初用first没有处理这个gorm.ErrRecordNotFound 错误,然后它不执行后面的代码。而Find不会返回错误,条件符合时直接给我创建了。

如果对象设置了主键,条件查询将不会覆盖主键的值,而是用 And 连接条件。 例如:

var user = User{ID: 10}
db.Where("id = ?", 20).First(&user)
// SELECT * FROM users WHERE id = 10 and id = 20 ORDER BY id ASC LIMIT 1

这个查询将会给出record not found错误 所以,在你想要使用例如 user 这样的变量从数据库中获取新值前,需要将例如 id 这样的主键设置为nil。

HAVING

HAVING 子句用于对 GROUP BY 子句产生的分组结果进行条件过滤。它的作用类似于 WHERE 子句,但是 WHERE 子句不能与聚合函数一起使用,而 HAVING 可以。

LIKE和等于符号

等值操作符(=)可以高效地利用索引进行查询,因为索引是为快速查找等值条件设计的。如果查询字段上有索引,使用=通常可以获得很好的性能。LIKE操作符在模式匹配时,如果使用前缀通配符(如'%value'),则无法有效利用索引,因为通配符表示前面的任意字符,索引树无法跳过不匹配的值。如果使用后缀或中间通配符(如'value%''%value%'),某些数据库优化可以利用索引,但性能通常不如等值查询。

等值操作符(=)通常在性能上优于LIKE操作符,特别是在可以使用索引的情况下。如果需要使用LIKE进行模糊匹配,尽量避免使用前缀通配符,以提高查询效率。在设计数据库查询时,考虑到性能因素,合理使用索引和查询操作符是非常重要的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值