账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    go db.QueryRow(sql).Scan 能将结果集Scan到一个map里面去吗?
    75
    0
    如题,可以实现吗?我自己写的,他一直提示不是一个指针。func selectOne(id int) { res := map[string]*interface{}{"id": nil, "name": nil, "password": nil, "add_time": nil} fmt.Println(res) sql := "select * from test where id = ?" err := db.QueryRow(sql, id).Scan(res["id"], res["name"], res["password"], res["add_time"]) if err != nil { fmt.Println("获取数据失败:", err.Error()) } else { fmt.Println(res) }}
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ゾ等ミ流星ジ 普通会员 1楼

      在Go语言中,go db.QueryRow(sql).Scan()方法用于从数据库中获取一行数据,然后使用Scan方法将结果集中的每一条数据存储到一个Map中。以下是一个示例:

      ```go package main

      import ( "database/sql" "fmt" "log"

      _ "github.com/go-sql-driver/mysql"
      

      )

      type Employee struct { ID int Name string Email string }

      func main() { // Connect to the database db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database_name") if err != nil { log.Fatal(err) }

      // Prepare the SQL statement
      const sql = "SELECT ID, Name, Email FROM Employees"
      
      // Execute the SQL statement
      var employees []Employee
      err = db.QueryRow(sql).Scan(&employees)
      
      // Check if the SQL statement executed successfully
      if err != nil {
          log.Fatal(err)
      }
      
      // Print the employee data
      for _, employee := range employees {
          fmt.Printf("ID: %d, Name: %s, Email: %s\n", employee.ID, employee.Name, employee.Email)
      }
      
      // Close the database connection
      db.Close()
      

      } ```

      在这个示例中,我们首先连接到MySQL数据库,然后使用QueryRow方法执行SQL语句,该语句获取名为Employees的表中的所有ID,Name和Email列。Scan方法用于从查询结果中读取每一行数据,并将其存储到切片employees中。

      Scan方法接收三个参数:查询结果的查询结果集,以及一个回调函数,该函数在每条数据读取完成后被调用。在这个例子中,我们使用一个嵌套的循环遍历employees切片,然后打印每一条数据的ID,Name和Email字段。

      注意,Scan方法的参数sql是数据库查询语句,而不是Map的键值对。如果你希望将查询结果中的每一条数据映射到Map的键值对,你可以在回调函数中使用map[string]interface{}类型接收这些键值对,并使用Set方法更新Map的值。例如:

      ```go func processEmployee(employee *Employee) { _employee.Name = "John Doe" _employee.Email = "john.doe@example.com" .employee.ID = 123

      // Update the Map
      

      employeeMap := make(map[string]interface{}) employeeMap["Name"] = employee.Name employeeMap["Email"] = employee.Email employeeMap["ID"] = employee.ID

      // Print the updated employee data
      fmt.Printf("Updated employee data: Name: %s, Email: %s, ID: %d\n", employeeMap["Name"], employeeMap["Email"], employeeMap["ID"])
      

      } ```

      在这个例子中,我们首先将员工的Name和Email字段更新为新的值,然后创建一个map[string]interface{}类型的新Map,并将员工ID字段设置为新的值。最后,我们打印出更新后的员工数据。

    • 樱空之雪 普通会员 2楼

      在Go语言中,go db.QueryRow(sql).Scan()方法用于从数据库中获取一行数据,然后使用Scan方法将结果集中的每一条数据存储到一个Map中。以下是一个示例:

      ```go package main

      import ( "database/sql" "fmt" "log"

      _ "github.com/go-sql-driver/mysql"
      

      )

      type Employee struct { ID int Name string Email string }

      func main() { // Connect to the database db, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database_name") if err != nil { log.Fatal(err) }

      // Prepare the SQL statement
      const sql = "SELECT ID, Name, Email FROM Employees"
      
      // Execute the SQL statement
      var employees []Employee
      err = db.QueryRow(sql).Scan(&employees)
      
      // Check if the SQL statement executed successfully
      if err != nil {
          log.Fatal(err)
      }
      
      // Print the employee data
      for _, employee := range employees {
          fmt.Printf("ID: %d, Name: %s, Email: %s\n", employee.ID, employee.Name, employee.Email)
      }
      
      // Close the database connection
      db.Close()
      

      } ```

      在这个示例中,我们首先连接到MySQL数据库,然后使用QueryRow方法执行SQL语句,该语句获取名为Employees的表中的所有ID,Name和Email列。Scan方法用于从查询结果中读取每一行数据,并将其存储到切片employees中。

      Scan方法接收三个参数:查询结果的查询结果集,以及一个回调函数,该函数在每条数据读取完成后被调用。在这个例子中,我们使用一个嵌套的循环遍历employees切片,然后打印每一条数据的ID,Name和Email字段。

      注意,Scan方法的参数sql是数据库查询语句,而不是Map的键值对。如果你希望将查询结果中的每一条数据映射到Map的键值对,你可以在回调函数中使用map[string]interface{}类型接收这些键值对,并使用Set方法更新Map的值。例如:

      ```go func processEmployee(employee *Employee) { _employee.Name = "John Doe" _employee.Email = "john.doe@example.com" .employee.ID = 123

      // Update the Map
      

      employeeMap := make(map[string]interface{}) employeeMap["Name"] = employee.Name employeeMap["Email"] = employee.Email employeeMap["ID"] = employee.ID

      // Print the updated employee data
      fmt.Printf("Updated employee data: Name: %s, Email: %s, ID: %d\n", employeeMap["Name"], employeeMap["Email"], employeeMap["ID"])
      

      } ```

      在这个例子中,我们首先将员工的Name和Email字段更新为新的值,然后创建一个map[string]interface{}类型的新Map,并将员工ID字段设置为新的值。最后,我们打印出更新后的员工数据。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部