[go]gorm框架中where函数一次失败的优化经验

gorm

gorm是一种基于Go语言开发的ORM(Object-Relational Mapping)库,可以方便地将Go中的结构体和数据库中的表进行映射,完成数据的增删改查操作。gorm具有易用性、性能高、支持多种数据库等特点,是Go语言中使用广泛的ORM库之一。另外,gorm还提供了一些高级特性,如事务处理、预加载、连接池等,使得开发者可以更轻松地进行数据库开发。

目标

使用gorm中的where函数查询

在GORM中,where函数是用于构建SQL WHERE子句的方法。它可以用于过滤数据库记录,并返回符合条件的结果。

where函数的用法有以下几种:

  1. 字符串语法:
db.Where("name = ?", "john").Find(&users)

这个where语句将会生成一个SQL查询语句:

SELECT * FROM users WHERE name = 'john';
  1. Struct和Map语法:

使用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;
  1. Struct和Map语法(NOT):

使用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';
  1. Struct和Map语法(IN):

使用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');
  1. Struct和Map语法(LIKE):

使用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查询语句。

where使用特点

使用之后发现,上述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我,感激不尽

你可能感兴趣的:(golang,数据库,sql)