用于GO结构的自定义扫描仪



我在GO中写了一种类似于休息的API。我拥有的数据库是遗产,因此我不控制字段名称或结构,或者对此有任何关系。我正在在一个称为数据存储的单独软件包中抽象数据库访问方法。我看起来像这样的代码(跳过所有错误处理等)

键入DataStore struct {}键入对象struct {  id uint  名称字符串  ...这里有几百万个领域}func(dataStore)objectlist(){  var对象 *[]对象  db,_:= sqlx.open(" postgres",conn_info)  行,_:= sqlx.queryx("从object_table select * select *")  defer lows.close()  for lows.next(){    var obj对象    lows.scan(&obj.id,&obj.name)    对象= append(对象,obj)  }  返回对象}

我目前遇到的问题是对象表有数十个字段。我在乎一些,但有些我不关心。有些被称为与对象相同的命名,有些则不是。最终,我需要支持其中的大多数,但是我首先要撰写概念证明。如果扫描代码在行中找到比扫描参数()中存在的字段更多的字段,则该扫描代码似乎会失败。我可以在查询select id, name from object_table中列出我扫描的字段,但是1.它使代码极为丑陋(SQL无法通过GOFMT的格式化)2.当我想支持另一个字段

时,它添加了我需要编辑的另一个位置

是否有任何方法可以实现将行对象取用对象的自定义扫描仪界面,将一些数据从结构中加载并忽略其余的?

您已经在使用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;")

最新更新