使用database/sql在golang中从mysql检索记录。

huangapple go评论94阅读模式
英文:

Retrieve a record from mysql in golang using database/sql

问题

我正在尝试从MySQL表中检索记录并将其转换为JSON。但是我遇到了一个错误,错误信息是:“.\main.go:67: :=左侧没有新变量”。我是Golang的新手,请帮助我解决这个错误!以下是我的代码:

func GetUser(w http.ResponseWriter, r *http.Request) {

  urlParams := mux.Vars(r)
  id := urlParams["id"]
  ReadUser := User{}
  con, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")

  err := con.QueryRow("select * from users where user_id=?", id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)
  switch {
      case err == sql.ErrNoRows:
              fmt.Fprintf(w, "No such user")
      case err != nil:
              log.Fatal(err)
      default:
        output, _ := json.Marshal(ReadUser)
        fmt.Fprintf(w, string(output))
  }
}

func main() {

  gorillaRoute := mux.NewRouter()
  gorillaRoute.HandleFunc("/api/user/create", CreateUser)
  gorillaRoute.HandleFunc("/api/user/read/:id", GetUser)
  http.Handle("/", gorillaRoute)
  http.ListenAndServe(":8080", nil)
}

这是我的新代码,但仍然无法从数据库表中获取记录,请帮助我找出错误或我做错了什么?

package main

import (
	"database/sql"
	"encoding/json"
	"fmt"
	"log"
	"net/http"

	_ "github.com/go-sql-driver/mysql"
	"github.com/gorilla/mux"
)

type API struct {
	Message string `json:"message"`
}
type User struct {
	ID    int    `json:"id"`
	Name  string `json:"username"`
	Email string `json:"email"`
	First string `json:"first"`
	Last  string `json:"last"`
}

func Hello(w http.ResponseWriter, r *http.Request) {

	// urlParams := mux.Vars(r)
	// name := urlParams["user"]
	HelloMessage := "User Creation page"

	message := API{HelloMessage}
	output, err := json.Marshal(message)

	if err != nil {
		fmt.Println("Something went wrong!")
	}

	fmt.Fprintf(w, string(output))

}

//POST A USER INTO DB
func CreateUser(w http.ResponseWriter, r *http.Request) {
	NewUser := User{}
	NewUser.Name = r.FormValue("user")
	NewUser.Email = r.FormValue("email")
	NewUser.First = r.FormValue("first")
	NewUser.Last = r.FormValue("last")
	output, err := json.Marshal(NewUser)
	fmt.Println(string(output))
	if err != nil {
		fmt.Println("Something went wrong!")
	}
	con, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
	sqlQuery := "INSERT INTO users set user_nickname='" + NewUser.Name + "', user_first='" + NewUser.First + "', user_last='" + NewUser.Last + "', user_email='" + NewUser.Email + "'"
	q, err := con.Exec(sqlQuery)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(q)
}

//GET USERS FROM DB
func GetUsers(w http.ResponseWriter, r *http.Request) {

	db, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
	if err != nil {
		panic(err)
	}
	err = db.Ping()
	if err != nil {
		panic(err)
	}
	defer db.Close()
	rows, err := db.Query("select * from users ")
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()
	var rowBuf, _ = rows.Columns()
	var cols = make([]string, len(rowBuf))
	copy(cols, rowBuf)
	fmt.Println(rowBuf)
	var vals = make([]interface{}, len(rowBuf))
	for i, _ := range rowBuf {
		vals[i] = &rowBuf[i]
	}
	for rows.Next() {
		err := rows.Scan(vals...)
		if err != nil {
			log.Fatal(err)
		}
		var m = map[string]interface{}{}
		for i, col := range cols {
			m[col] = vals[i]
		}
		obj, _ := json.Marshal(m)
		//
		fmt.Fprintf(w, string(obj))
	}
	err = rows.Err()
	if err != nil {
		log.Fatal(err)
	}
}
func GetUser(w http.ResponseWriter, r *http.Request) {
	urlParams := mux.Vars(r)
	id := urlParams["id"]
	ReadUser := User{}
	db, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
	stmt := db.QueryRow("select * from users where id = ?", id)
	if err != nil {
		log.Fatal(err)
	}

	err = stmt.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)
	if err != nil {
		log.Fatal(err)
	}

	result, err := json.Marshal(ReadUser)
	fmt.Fprintf(w, string(result))
}
func main() {

	gorillaRoute := mux.NewRouter()
	gorillaRoute.HandleFunc("/api/user/create", CreateUser)
	gorillaRoute.HandleFunc("/api/user/read", GetUsers)
	gorillaRoute.HandleFunc("/api/user/:id", GetUser)
	http.Handle("/", gorillaRoute)
	http.ListenAndServe(":8080", nil)
}

希望这可以帮助你找到错误并解决问题!

英文:

I'm trying to retrieve a record from mysql table and marshal it to json.
But i gotted the error that says : ".\main.go:67: no new variables on left sife of :="
I'm new in Golang Plz! help me to solve out this error!
My Code is :

func GetUser(w http.ResponseWriter, r *http.Request) {
urlParams   := mux.Vars(r)
id       := urlParams["id"]
ReadUser := User{}
con, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
err := con.QueryRow("select * from users where user_id=?",id).Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email )
switch {
case err == sql.ErrNoRows:
fmt.Fprintf(w,"No such user")
case err != nil:
log.Fatal(err)
default:
output, _ := json.Marshal(ReadUser)
fmt.Fprintf(w,string(output))
}
}

and Routes in main:

func main() {
gorillaRoute := mux.NewRouter()
gorillaRoute.HandleFunc("/api/user/create", CreateUser)
gorillaRoute.HandleFunc("/api/user/read/:id", GetUser)
http.Handle("/", gorillaRoute)
http.ListenAndServe(":8080", nil)
}

Here is my new Code , but again not able to get record from database table, plz help me to figure out the error OR what things i do wrong?
package main

import (
"database/sql"
"encoding/json"
"fmt"
"log"
"net/http"
_ "github.com/go-sql-driver/mysql"
"github.com/gorilla/mux"
)
type API struct {
Message string "json:message"
}
type User struct {
ID    int    "json:id"
Name  string "json:username"
Email string "json:email"
First string "json:first"
Last  string "json:last"
}
func Hello(w http.ResponseWriter, r *http.Request) {
// urlParams := mux.Vars(r)
// name := urlParams["user"]
HelloMessage := "User Creation page"
message := API{HelloMessage}
output, err := json.Marshal(message)
if err != nil {
fmt.Println("Something went wrong!")
}
fmt.Fprintf(w, string(output))
}
//POST A USER INTO DB
func CreateUser(w http.ResponseWriter, r *http.Request) {
NewUser := User{}
NewUser.Name = r.FormValue("user")
NewUser.Email = r.FormValue("email")
NewUser.First = r.FormValue("first")
NewUser.Last = r.FormValue("last")
output, err := json.Marshal(NewUser)
fmt.Println(string(output))
if err != nil {
fmt.Println("Something went wrong!")
}
con, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
sqlQuery := "INSERT INTO users set user_nickname='" + NewUser.Name + "', user_first='" + NewUser.First + "', user_last='" + NewUser.Last + "', user_email='" + NewUser.Email + "'"
q, err := con.Exec(sqlQuery)
if err != nil {
fmt.Println(err)
}
fmt.Println(q)
}
//GET USERS FROM DB
func GetUsers(w http.ResponseWriter, r *http.Request) {
db, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
defer db.Close()
rows, err := db.Query("select * from users ")
if err != nil {
log.Fatal(err)
}
defer rows.Close()
var rowBuf, _ = rows.Columns()
var cols = make([]string, len(rowBuf))
copy(cols, rowBuf)
fmt.Println(rowBuf)
var vals = make([]interface{}, len(rowBuf))
for i, _ := range rowBuf {
vals[i] = &rowBuf[i]
}
for rows.Next() {
err := rows.Scan(vals...)
if err != nil {
log.Fatal(err)
}
var m = map[string]interface{}{}
for i, col := range cols {
m[col] = vals[i]
}
obj, _ := json.Marshal(m)
//
fmt.Fprintf(w, string(obj))
}
err = rows.Err()
if err != nil {
log.Fatal(err)
}
}
func GetUser(w http.ResponseWriter, r *http.Request) {
urlParams := mux.Vars(r)
id := urlParams["id"]
ReadUser := User{}
db, err := sql.Open("mysql", "root:YES@/social_network?charset=utf8")
stmt := db.QueryRow("select * from users where id = ?", id)
if err != nil {
log.Fatal(err)
}
err = stmt.Scan(&ReadUser.ID, &ReadUser.Name, &ReadUser.First, &ReadUser.Last, &ReadUser.Email)
if err != nil {
log.Fatal(err)
}
result, err := json.Marshal(ReadUser)
fmt.Fprintf(w, string(result))
}
func main() {
gorillaRoute := mux.NewRouter()
gorillaRoute.HandleFunc("/api/user/create", CreateUser)
gorillaRoute.HandleFunc("/api/user/read", GetUsers)
gorillaRoute.HandleFunc("/api/user/:id", GetUser)
http.Handle("/", gorillaRoute)
http.ListenAndServe(":8080", nil)
}

答案1

得分: 2

err :=中的冒号:移除,因为你正在给现有变量赋新值。

英文:

Remove the colon : from err := as you are assigning a new value to existing variable.

huangapple
  • 本文由 发表于 2015年6月11日 15:45:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/30774681.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定