gorm是一种基于Go语言开发的ORM(Object-Relational Mapping)库,可以方便地将Go中的结构体和数据库中的表进行映射,完成数据的增删改查操作。gorm具有易用性、性能高、支持多种数据库等特点,是Go语言中使用广泛的ORM库之一。另外,gorm还提供了一些高级特性,如事务处理、预加载、连接池等,使得开发者可以更轻松地进行数据库开发。
在GORM中,where函数是用于构建SQL WHERE子句的方法。它可以用于过滤数据库记录,并返回符合条件的结果。
where函数的用法有以下几种:
db.Where("name = ?", "john").Find(&users)
这个where语句将会生成一个SQL查询语句:
SELECT * FROM users WHERE name = 'john';
使用Struct语法:
type User struct {
Name string
Age int
}
db.Where(&User{Name: "john", Age: 20}).Find(&users)
使用Map语法:
db.Where(map[string]interface{}{"name": "john", "age": 20}).Find(&users)
这样的where语句将会生成一个SQL查询语句:
SELECT * FROM users WHERE name = 'john' AND age = 20;
使用Struct语法:
db.Not(&User{Name: "john"}).Find(&users)
使用Map语法:
db.Not(map[string]interface{}{"name": "john"}).Find(&users)
生成的SQL查询语句将会类似于:
SELECT * FROM users WHERE NOT name = 'john';
使用Struct语法:
db.Where("name in (?)", []string{"john", "jane", "bob"}).Find(&users)
使用Map语法:
db.Where(map[string]interface{}{"name": []string{"john", "jane", "bob"}}).Find(&users)
生成的SQL查询语句将会类似于:
SELECT * FROM users WHERE name IN ('john', 'jane', 'bob');
使用Struct语法:
db.Where("name LIKE ?", "%john%").Find(&users)
使用Map语法:
db.Where(map[string]interface{}{"name": "%john%"}).Find(&users)
生成的SQL查询语句将会类似于:
SELECT * FROM users WHERE name LIKE '%john%';
总的来说,where函数是非常强大和灵活的,它可以用于构建各种类型的SQL查询语句。
使用之后发现,上述4中方法字段"name"都是提前写死的,这意味着我们在写代码中如果想使用where函数,就必须为每个字段都写个函数
func FindUserByName(name string) *gorm.DB {
user := UserBasic{}
res := utils.DB.Where("name = ?",name).First(&user)
if err := res.Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 未找到记录,即为空值
fmt.Println("未找到记录")
return nil
} else {
// 其他错误
fmt.Println("发生错误:", err)
}
} else {
// 找到记录
fmt.Println("找到记录")
}
return res
}
后面我想能不能通过传参来SQL查询
func FindUserByFiled(filed string , arguments string) *gorm.DB {
user := UserBasic{}
res := utils.DB.Where("?= ?",argunments,filed).First(&user)
if err := res.Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// 未找到记录,即为空值
fmt.Println("未找到记录")
return nil
} else {
// 其他错误
fmt.Println("发生错误:", err)
}
} else {
// 找到记录
fmt.Println("找到记录")
}
return res
}
修改后发现传回值为空,打印SQL日志发现触发的SQL
SELECT * FROM `user_baisc` WHERE ('name'= 'try2' ) AND `user_baisc`.`deleted_at` IS NULL ORDER BY `user_baisc`.`id` LIMIT 1
问题是?占位符,传进去的值是 ‘?’,而不是?或者`?`
很明显是SQL语法错误。
这个时候我在想换个占位符行不
//res := utils.DB.Where("?= ?",argunments,filed).First(&user)
res := utils.DB.Where("%s= ?",argunments,filed).First(&user)
然后喜提ERROR+1,传进去的SQL是这样的
ELECT * FROM `user_baisc` WHERE (%s= 'name' and %s = 'try2') AND `user_baisc`.`deleted_at` IS NULL ORDER BY `user_baisc`.`id` LIMIT 1
Where函数并没有支持占位符%s
在查询gorm文档的过程中,也没有发现相应的方法,如有有同行找到了,请Q我,感激不尽