2015-04-01 5 views
0

В настоящее время я работаю над проектом Google App Engine Golang и столкнулся с небольшой проблемой. У меня есть база данных «вечеринка» со столами «вечеринки». Проблема заключается в том, что при выполнении следующего кода печатается массив EMPTY json - он действительно длинный, но содержит только пустые Стороны. (И у меня есть записи в моей базе данных)go mysql return null values ​​

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

** Никогда ** игнорировать 'error' возвращает! ИМО это даже не стоит смотреть на это, пока вы не добавите хотя бы минимальную проверку ошибок. –

+0

есть ли ошибка, проигнорированная, помимо той, которая может возникнуть при разборе json (что не проблема - поверьте, я проверил)? –

+0

Возможно, вы проверили один раз. Если он не проверен в коде, никто (даже вы) не знает, что некоторая ошибка там не происходит. –

ответ

1

Это предположение, но я думаю, что это потому, что вы закрыть соединение с базой данных здесь:

defer con.Close() 

Это закроет соединение с базой данных при getRowsFromSql возвращается, поэтому к моменту начала звонка rows.Next() в scanForParties соединение с БД исчезло. Как только соединение DB будет закрыто, любая коллекция строк больше не будет доступна.

Из-за этого возможно что-то, вероятно, возвращает error, но поскольку вы не проверяете какие-либо ошибки нигде, вы не будете знать. В Go идиоматично проверять наличие ошибок, когда функция может возвращать один (и другие языки тоже, а тем более в Go из-за отсутствия исключений).

+0

Хорошо, это кажется обещающим. Я постараюсь, когда приеду на работу –

0

Итак, все остальные были прав насчет ошибок: rows.Scan() возвращает ошибку. И когда я, наконец, проверил его, он сказал, что при этом недостаточно переменных сканирования. Простое исправление: добавьте отсутствующий.

Спасибо, ребята :)