Golang Go-SQLite3无法迭代类型错误

时间:2015-11-17 21:05:45

标签: go sqlite

尝试使用github.com/mattn/go-sqlite3's存储库中的示例时,尝试使用Go 1.5.1 darwin / amd64编译代码时出现以下错误:

non-bool rows.Next() (type error) used as for condition

我使用的代码是:

conn, err := sqlite3.Open("./example.db")
if err != nil {
    log.Panic(err)
}
defer conn.Close()
rows, err := conn.Query("SELECT * FROM scans ORDER BY id DESC;")
if err != nil {
    log.Panic(err)
}
for rows.Next() {
    var id int
    var method string
    var uuid string
    var scan int
    rows.Scan(&id, &method, &uuid, &scan)
    log.Print(id, method, uuid, scan)
}

这里有什么我想念的吗?这是基于此处的示例: https://github.com/mattn/go-sqlite3/blob/master/_example/simple/simple.go#L81-L91

1 个答案:

答案 0 :(得分:4)

是的,你错过了。

您没有使用database/sql套餐,但使用的是sqlite3套餐!

sql.Open()返回sql.DBDB.Query()返回sql.RowsRows.Next()为:

func (rs *Rows) Next() bool

但是,您拨打sqlite3.Open()并返回sqlite3.Conn,然后拨打Conn.Query(),其中会返回sqlite3.Stmt,您将其命名为 rows !因此 rows.Next() Stmt.Next() ,这是:

func (s *Stmt) Next() error

混乱之源

令人困惑,因为sqlite3是符合内置database/sql接口的驱动程序,但它还提供了另一个接口,您可以通过其特定于供应商的sqlite3接口使用它。

使用database/sql包,你可以这样开始:

db, err := sql.Open("sqlite3", "./foo.db")