如何使用GORM一次读取一行SQLite数据库
我有以下代码如何使用GORM一次读取一行SQLite数据库,go,go-gorm,Go,Go Gorm,我有以下代码 package main import ( "database/sql" "fmt" "log" _ "github.com/mattn/go-sqlite3" ) func getDatabaseHandle(dbpath string) (*sql.DB, error) { database, err := sql.Open("sqlite3", dbpath) if err != nil { log.Pri
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/mattn/go-sqlite3"
)
func getDatabaseHandle(dbpath string) (*sql.DB, error) {
database, err := sql.Open("sqlite3", dbpath)
if err != nil {
log.Printf("Failed to create the handle")
return nil, err
}
if err = database.Ping(); err != nil {
fmt.Printf("Failed to keep connection alive")
return nil, err
}
return database, nil
}
func getAllRows(database *sql.DB, table string) {
query := fmt.Sprintf("SELECT User, AppName FROM %s LIMIT 10", table)
rows, err := database.Query(query)
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var id int
var app string
rows.Scan(&id, &app)
fmt.Println(id, app)
}
}
func main() {
db, err := getDatabaseHandle("./gozo.db")
if err != nil {
panic(err)
}
defer db.Close()
getAllRows(db, "timesheet")
}
这是针对具有以下列的SQLite数据库的
id、用户、事项、AppName、AppDesc、持续时间、类型、时间戳
上面的代码非常完美。但有两个问题
,这很烦人,而且不容易模块化
type Timesheet struct {
id int
User int
Matter int
AppName string
AppDesc string
Duration int64
Type string
Timestamp string
}
// TableName -- Sets the table name
func (ts Timesheet) TableName() string {
return "timesheet"
}
func main() {
db, err := gorm.Open("sqlite3", "./gozo.db")
if err != nil {
panic(err)
}
defer db.Close()
var ts []Timesheet
db.Find(&ts).Limit(5)
fmt.Println(ts)
}
但这并没有正确地为我提供数据,而是为我提供了所有值0。此外,这并不是使用每个行扫描迭代,这样我就可以在执行其他相关操作时包装这个go并发性。这似乎在收集所有数据,这也是错误的。请告诉我如何使用GORM扫描循环中的每一行并获得正确的数据。我找到了答案。GORM文档并没有那么冗长,但流程可能是答案
package main
import (
"fmt"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
)
// Product -- Represents a product
type Product struct {
gorm.Model
Code string
Price uint
}
// TableName setting the table name
func (Product) TableName() string {
return "allProducts"
}
func main() {
db, err := gorm.Open("sqlite3", "test.db")
if err != nil {
panic("failed to connect database")
}
defer db.Close()
var product Product
rows, err := db.Model(&Product{}).Rows()
defer rows.Close()
if err != nil {
panic(err)
}
for rows.Next() {
db.ScanRows(rows, &product)
fmt.Println(product)
}
}
结构看起来不太正确,您缺少gorm结构标记。和gorm模型,也是关于一次获取一行的初始问题。。您需要为循环设置一个限制值1和一个偏移计数器,对于第二个问题,我已经找到了答案,但是对于第一个问题,我不知道我的结构是如何错误的。