Golang/MySQL:如何高效查询单条记录?

Golang/MySQL:如何高效查询单条记录? 我编写了一个函数来获取产品切片,但这个函数只返回单个记录的切片。 注意:我在MySQL控制台中尝试了相同的查询,找到了近200条记录。

func FindProductsByQueryString(query, search string) (result []Product, err error) {
connection, err := sql.Open("mysql", "My database config")
if err != nil {
	return
}

rows, err := connection.Query(query, search)
if err != nil {
	log.Println(err.Error())
	return
}

defer rows.Close()
if rows.Next() {
	prod := Product{}
	err = rows.Scan(&prod.Id, &prod.Name, &prod.Group, &prod.Category, &prod.Brand,
		&prod.Url, &prod.Image, &prod.OPrice, &prod.Price, &prod.TRate, &prod.Rate, &prod.Unit)
	if err != nil {
		log.Println(err.Error())
		return
	}

	result = append(result, prod)
  }

  return
}

原始查询:

SELECT * FROM product WHERE MATCH(Name) AGAINST(?);

示例查询:

SELECT * FROM product WHERE MATCH(Name) AGAINST('Nokia');

更多关于Golang/MySQL:如何高效查询单条记录?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

天哪,我真是太蠢了。不过还是谢谢你。

更多关于Golang/MySQL:如何高效查询单条记录?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


引用 samadadi:

if rows.Next() {

你的意思是 for rows.Next()。没有循环,就没有多个条目。

您的问题在于代码逻辑只处理了查询结果的第一行记录。rows.Next() 在循环外只执行一次,导致仅获取单条记录。以下是修正后的代码:

func FindProductsByQueryString(query, search string) (result []Product, err error) {
    connection, err := sql.Open("mysql", "My database config")
    if err != nil {
        return nil, err
    }
    defer connection.Close()

    rows, err := connection.Query(query, search)
    if err != nil {
        log.Println(err.Error())
        return nil, err
    }
    defer rows.Close()

    for rows.Next() {
        prod := Product{}
        err = rows.Scan(&prod.Id, &prod.Name, &prod.Group, &prod.Category, &prod.Brand,
            &prod.Url, &prod.Image, &prod.OPrice, &prod.Price, &prod.TRate, &prod.Rate, &prod.Unit)
        if err != nil {
            log.Println(err.Error())
            return nil, err
        }
        result = append(result, prod)
    }

    // 检查遍历过程中是否出现错误
    if err = rows.Err(); err != nil {
        log.Println(err.Error())
        return nil, err
    }

    return result, nil
}

主要修改:

  1. 使用 for rows.Next() 循环遍历所有结果行
  2. 添加 defer connection.Close() 确保数据库连接正确关闭
  3. 添加 rows.Err() 检查处理行迭代过程中的潜在错误
  4. 在所有错误路径上明确返回 nil 切片和错误

这样修改后,函数将返回所有匹配查询条件的记录,而不仅仅是第一条。

回到顶部