首页 文章

Go中结构的自定义扫描仪

提问于
浏览
2

我在Go中编写了一种类似REST的API . 我拥有的数据库是遗留的,所以我不控制字段名称或结构或任何事情 . 我在一个名为datastore的独立包中抽象数据库访问方法 . 我的代码看起来像这样(跳过所有错误处理等)

type Datastore struct {}

type Object struct {
  id uint
  name string
  ... zillion more fields here
}

func (Datastore) ObjectList() {
  var objects *[]Object
  db, _ := sqlx.Open("postgres", conn_info)
  rows, _ := sqlx.Queryx("SELECT * FROM object_table")
  defer rows.Close()
  for rows.Next() {
    var obj Object
    rows.Scan(&obj.id, &obj.name)
    objects = append(objects, obj)
  }
  return objects
}

我目前遇到的问题是对象表有几十个字段 . 有些我关心,但有些我不关心 . 有些名称与Object相同,有些则不是 . 最终,我需要支持其中的大多数,但我首先要进行概念验证 . 如果扫描代码在行中找到的字段多于Scan()参数中的字段,则扫描代码似乎失败 . 我可以在查询 select id, name from object_table 中列出我扫描的字段,但是1.它使代码非常难看(SQL不会被gofmt格式化)2 . 当我想支持另一个字段时,它会添加另一个我需要编辑的地方

有没有办法实现一个自定义扫描程序接口,它将获取行对象,将一些数据从它加载到一个结构中,并忽略其余的?

1 回答

  • 0

    您已经在使用sqlx,所以在查询之前只需使用* DB.Unsafe():

    var db *sqlx.DB
    
    // exactly the same as the built-in
    db = sqlx.Open("sqlite3", ":memory:")
    var p Person
    udb := db.Unsafe()
    err = udb.Get(&p, "SELECT * FROM person, place LIMIT 1;")
    

相关问题