2015-06-11 2 views
-2

Я пытаюсь получить запись из таблицы mysql и маршал ее в json. Но я получил ошибку, которая гласит: «. \ Main.go: 67: никаких новых переменных на левой стороне: =« Я новичок в Golang Plz! помогите мне решить эту ошибку! Мой код:Извлечь запись из mysql в golang, используя базу данных/sql

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

    urlParams := mux.Vars(r) 
    id  := urlParams["id"] 
    ReadUser := User{} 
    con, err := sql.Open("mysql", "root:[email protected]/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) 
} 

Вот мой новый код, но опять-таки не в состоянии получить запись из таблицы базы данных, плз помочь мне выяснить ошибку ИЛИ что я делаю неправильно? пакета главного

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:[email protected]/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:[email protected]/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:[email protected]/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) 
} 
+0

Вот мой новый код, но снова я не могу получить запись из базы данных: –

+0

Два совета: рассмотрите возможность использования [sqlx] (https://github.com/jmoiron/sqlx) для маршалирования результатов запроса в Структуры. Вы также должны посмотреть на использование одного соединения в своем приложении: новый пул подключений через 'sql.Open' по каждому запросу крайне неэффективен. – elithrar

ответ

1

Удалить двоеточие : из err := как вы присваиваете новое значение существующего переменный.

+0

, когда я удаляю ':' из 'err: =' ошибка ушла, но не извлекает данные! –

+2

Потому что вы не проверяете ошибку как 'nil', прежде чем назначать ее еще раз. – thwd

Смежные вопросы