尝试使用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
答案 0 :(得分:4)
是的,你错过了。
您没有使用database/sql
套餐,但使用的是sqlite3
套餐!
sql.Open()
返回sql.DB
,DB.Query()
返回sql.Rows
,Rows.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")