2015-04-01 137 views
0

我目前正在研究一個Golang Google App Engine項目,並遇到一個小問題。我有一個數據庫「派對」與表「派對」。問題是,當執行下面的代碼時,會打印一個EMPTY json數組 - 它實際上很長,但它只包含空的締約方。 (我在我的數據庫條目)go mysql返回空值

Go代碼(不是全部):

func getParties(w http.ResponseWriter, r *http.Request) { 
    rows := getRowsFromSql("select * from parties;") 
    parties := scanForParties(rows) 

    json, _ := json.Marshal(parties) 
    fmt.Fprint(w, string(json)) 
} 

func scanForParties(rows *sql.Rows) []Party { 
    var parties []Party 

    for rows.Next() { 
     var id int 
     var name, author, datetime, datetime_to, host, location, description, longtitude, latitude, primary_image_id string 
     rows.Scan(&id, &name, &author, &datetime, &datetime_to, &host, &location, &description, &longtitude, &latitude, &primary_image_id) 
     party := Party{ 
      Id:   id, 
      Name:   name, 
      Author:  author, 
      Datetime:  datetime, 
      Datetime_to: datetime_to, 
      Host:   host, 
      Location:  location, 
      Description: description, 
      Longtitude: longtitude, 
      Latitude:  latitude, 
      PrimaryImgId: primary_image_id, 
     } 
     parties = append(parties, party) 
    } 

    return parties 
} 

func getRowsFromSql(query string) *sql.Rows { 
    con, err := sql.Open("mysql", dbConnectString) 
    if err != nil { 
     panic(err) 
    } 
    defer con.Close() 

    rows, err2 := con.Query(query) 
    if err != nil { 
     panic(err2) 
    } 
    return rows 

} 

type Party struct { 
    Id   int 
    Name   string 
    Author  string 
    Datetime  string 
    Datetime_to string 
    Host   string 
    Location  string 
    Description string 
    Longtitude string 
    Latitude  string 
    PrimaryImgId string 
} 

而我的當事人表:

mysql> describe parties; 
+------------------+----------------+------+-----+-------------------+-----------------------------+ 
| Field   | Type   | Null | Key | Default   | Extra      | 
+------------------+----------------+------+-----+-------------------+-----------------------------+ 
| id    | int(11)  | NO | PRI | NULL    | auto_increment    | 
| name    | varchar(64) | NO |  |     |        | 
| author   | varchar(64) | YES |  | NULL    |        | 
| datetime   | datetime  | YES |  | NULL    |        | 
| last_edited  | timestamp  | NO |  | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | 
| datetime_to  | datetime  | YES |  | NULL    |        | 
| host    | text   | YES |  | NULL    |        | 
| location   | text   | YES |  | NULL    |        | 
| description  | text   | YES |  | NULL    |        | 
| longitude  | decimal(23,20) | YES |  | NULL    |        | 
| latitude   | decimal(23,20) | YES |  | NULL    |        | 
| primary_image_id | varchar(256) | YES |  | NULL    |        | 
+------------------+----------------+------+-----+-------------------+-----------------------------+ 

然而,舊版本的代碼作品就好:

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

    con, dbErr := sql.Open("mysql", dbConnectString) 

    defer con.Close() 

    if dbErr == nil { 
     rows, _ := con.Query("select id, name, author, datetime from parties where datetime >= NOW();") 

     var parties []Party 

     var id int 
     var name string 
     var author string 
     var datetime string 

     for rows.Next() { 
      rows.Scan(&id, &name, &author, &datetime) 
      party := Party{} 
      party.Id = id 
      party.Name = name 
      party.Author = author 
      party.Datetime = datetime 
      parties = append(parties, party) 
     } 

     if len(parties) > 0 { 
      json, _ := json.Marshal(parties) 
      fmt.Fprint(w, string(json)) 
     } else { 
      fmt.Fprint(w, "{}") 
     } 

    } else { 
     fmt.Fprint(w, "{\"Error\"}") 
    } 
} 

任何想法爲什麼會發生這種情況? 感謝提前:)

+0

**從不**忽略'錯誤'返回!海事組織甚至不值得看這個,直到你至少添加了最少的錯誤檢查。 – 2015-04-01 18:00:54

+0

是否有任何被忽略的錯誤,除了解析json時可能出現的錯誤(這不是問題 - 相信我,我檢查過)? – 2015-04-01 18:03:10

+0

你檢查一次也許。如果沒有在代碼中檢查,沒有人(甚至你)知道現在沒有發生一些錯誤。 – 2015-04-01 18:04:13

回答

1

這是一個猜測,但我想那是因爲您要關閉到數據庫這裏的連接:

defer con.Close() 

這將關閉到數據庫時的連接getRowsFromSql返回,因此在scanForParties中開始調用rows.Next()時,數據庫連接消失。數據庫連接關閉後,任何行的集合將不再可用。

因爲這個原因可能會返回一個error,但是因爲您沒有在任何地方檢查任何您不知道的錯誤。在Go中,只要函數可以返回一個(和其他語言,在Go中更多,因爲沒有例外),就可以檢查錯誤。

+0

好吧,這個似乎是promissing。當我開始工作時我會嘗試 – 2015-04-02 05:10:30

0

好吧,所有其他人都正確的錯誤:rows.Scan()返回一個錯誤。當我最終檢查它時,它表示沒有提供足夠的掃描變量。簡單的修復:添加缺少的一個。

謝謝各位:)