Dumping MySQL tables to JSON with Golang

后端 未结 6 2004
余生分开走
余生分开走 2021-01-31 10:18

Was putting together a quick dumper for MySQL to JSON in Go. However I find that everything that I retrieve from the database is a []byte array. Thus instead of n

6条回答
  •  耶瑟儿~
    2021-01-31 10:41

    It is needed to use prepared statements to get the native types. MySQL has two protocols, one transmits everything as text, the other as the "real" type. And that binary protocol is only used when you use prepared statements. See https://github.com/go-sql-driver/mysql/issues/407

    The function getJSON below is correct:

    func getJSON(sqlString string) (string, error) {
      stmt, err := db.Prepare(sqlString)
      if err != nil {
        return "", err
      }
      defer stmt.Close()
    
      rows, err := stmt.Query()
      if err != nil {
        return "", err
      }
      defer rows.Close()
    
      columns, err := rows.Columns()
      if err != nil {
        return "", err
      }
    
      tableData := make([]map[string]interface{}, 0)
    
      count := len(columns)
      values := make([]interface{}, count)
      scanArgs := make([]interface{}, count)
      for i := range values {
        scanArgs[i] = &values[i]
      }
    
      for rows.Next() {
        err := rows.Scan(scanArgs...)
        if err != nil {
          return "", err
        }
    
        entry := make(map[string]interface{})
        for i, col := range columns {
          v := values[i]
    
          b, ok := v.([]byte)
          if (ok) {
            entry[col] = string(b)
          } else {
            entry[col] = v
          }
        }
    
        tableData = append(tableData, entry)
      }
    
      jsonData, err := json.Marshal(tableData)
      if err != nil {
        return "", err
      }
    
      return string(jsonData), nil 
    }
    

提交回复
热议问题