我正在尝试使用database/sql和mysql驱动程序构建API,该API将根据URL参数读取数据。
类似于这样的方式。
我知道如何在定义了结构体的情况下获取所有列或仅获取特定列。但我想知道是否可以从网址中获取列,将其保存到映射中,然后只需扫描这些列,而不是预定义的结构体。
我有可行的代码,仅当列数与结构体中相同的列数时,该代码将从上述端点获取数据。如果例如删除
我不需要具体的代码,只需要一些方向,因为我正在学习Go,而我的背景是PHP,在那里这样做更容易。
更新
感谢答案,我已经有部分工作的解决方案。
这是代码:
类似于这样的方式。
myapi.com/users?columns=id,first_name,last_name,country&sort=desc&sortColumn=last_name&limit=10&offset=20
我知道如何在定义了结构体的情况下获取所有列或仅获取特定列。但我想知道是否可以从网址中获取列,将其保存到映射中,然后只需扫描这些列,而不是预定义的结构体。
我有可行的代码,仅当列数与结构体中相同的列数时,该代码将从上述端点获取数据。如果例如删除
country
,则会收到错误消息,指出Scan
期望4个参数,但只提供了3个。我不需要具体的代码,只需要一些方向,因为我正在学习Go,而我的背景是PHP,在那里这样做更容易。
更新
感谢答案,我已经有部分工作的解决方案。
这是代码:
cols := []string{"id", "first_name", "last_name"}
vals := make([]interface{}, len(cols))
w := map[string]interface{}{"id": 105}
var whereVal []interface{}
var whereCol []string
for k, v := range w {
whereVal = append(whereVal, v)
whereCol = append(whereCol, fmt.Sprintf("%s = ?", k))
}
for i := range cols {
vals[i] = new(interface{})
}
err := db.QueryRow("SELECT "+strings.Join(cols, ",")+" FROM users WHERE "+strings.Join(whereCol, " AND "), whereVal...).Scan(vals...)
if err != nil {
fmt.Println(err)
}
b, _ := json.Marshal(vals)
fmt.Println(string(b))
这应该查询 SELECT id, first_name, last_name FROM users WHERE id = 105;
但是如何将数据输出到正确的JSON对象中呢?现在它打印出像这样以base64编码的字符串。
[105,"Sm9obm55","QnJhdm8="]