一、连接
在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)
还是没有找到我出现的问题。
后面了解到:
-
First
方法:First
方法用于查找与查询条件匹配的第一个记录,并将其作为指针传递给指定的变量。- 如果没有找到记录,
First
会返回gorm.ErrRecordNotFound
错误,并且RowsAffected
会是 0。
-
Find
方法:Find
方法用于查找与查询条件匹配的所有记录,并将它们作为切片传递给指定的变量。- 如果没有找到记录,
Find
不会返回错误,RowsAffected
也会是 0。
-
RowsAffected
的使用:RowsAffected
仅在使用Find
方法时有效。在First
方法中,如果记录未找到,RowsAffected
可能不会正确设置。
-
错误处理:
- 当使用
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
进行模糊匹配,尽量避免使用前缀通配符,以提高查询效率。在设计数据库查询时,考虑到性能因素,合理使用索引和查询操作符是非常重要的。