去mysql返回空值

时间:2015-04-01 18:00:02

标签: mysql go

我目前正在开发Golang Google App Engine项目并遇到了一个小问题。我有一个数据库" party"与表"派对"。问题是当执行以下代码时,会打印一个EMPTY json数组 - 它实际上很长,但它只包含空方。 (而且我的数据库中有条目)

转到代码(不是全部代码):

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\"}")
    }
}

知道为什么会这样吗? 在此先感谢:)

2 个答案:

答案 0 :(得分:1)

这是猜测,但我认为这是因为你在这里关闭了与数据库的连接:

defer con.Close()

这将在getRowsFromSql返回时关闭与数据库的连接,因此当您开始在rows.Next()中调用scanForParties时,数据库连接将消失。关闭数据库连接后,任何行集合将不再可用。

由于这个原因,某些东西可能会返回error,但是因为你没有在任何地方检查任何错误,你不会知道。在Go中,只要函数可以返回一个函数(以及其他语言,因为缺少例外情况,在Go中更是如此)来检查错误是惯用的。

答案 1 :(得分:1)

好的,所有其他人都对错误有所了解:rows.Scan()返回错误。当我最终检查它时,它说没有提供足够的扫描变量。简单修复:添加缺少的一个。

谢谢你们:)