Go 使用db.Query返回多个列

Go 使用db.Query返回多个列,go,Go,在Go SQL文档中,他们给出了一个只返回1列的查询示例(我认为这是一个糟糕的示例,至少返回2…) 文件说, 扫描将当前行中的列复制到dest指向的值中 这是如何与结构一起工作的,假设我有一个结构 type User struct{ Name string Age int } 我将查询修改为SELECT name,age from users,其中age=? 如何将*行解压缩到结构中?我确实找到了这个例子,但它不涉及结构。我将遵循活动记录模式约定,这样我的结构将通过snake-

在Go SQL文档中,他们给出了一个只返回1列的查询示例(我认为这是一个糟糕的示例,至少返回2…)

文件说, 扫描将当前行中的列复制到dest指向的值中

这是如何与结构一起工作的,假设我有一个结构

type User struct{
    Name string
    Age int
}
我将查询修改为
SELECT name,age from users,其中age=?

如何将*行解压缩到结构中?我确实找到了这个例子,但它不涉及结构。我将遵循活动记录模式约定,这样我的结构将通过snake-case转换映射到我的数据库。

看,复制似乎是通过目标指针上的
语法完成的:

func (rs *Rows) Scan(dest ...interface{}) error
因此,在您的示例中,您可以执行以下操作:

for rows.Next() {
    u := User{} // An empty user
    ...
    if err := rows.Scan(&u.Name, &u.Age); err != nil {
        ...
    }
 }
只要您传递了确切数量的指针,无论它们是否来自结构,这都应该有效。

看看,复制似乎是用目标指针上的
语法完成的:

func (rs *Rows) Scan(dest ...interface{}) error
因此,在您的示例中,您可以执行以下操作:

for rows.Next() {
    u := User{} // An empty user
    ...
    if err := rows.Scan(&u.Name, &u.Age); err != nil {
        ...
    }
 }

只要您传递了确切数量的指针,无论它们是否来自结构,这都应该有效。

如果我首先选择了年龄,然后选择了姓名,例如选择了年龄,那么上面的姓名会不会出现问题,即是否顺序?我相信是的。如果要反转查询,则对
err:=convertsign(dest[i],sv)
的调用将失败,
row.Scan
方法将返回错误,由于它无法将
int
转换为
string
,这使得反射无法实现这一点,因为您无法保证模型字段与数据库的列顺序同步(也不是没有学究性和不切实际性的),因此出于效率原因,我认为应该将其设置为尽可能低的级别。没有什么可以阻止你在上面实现一个更为用户友好/灵活的访问(例如,构建一个
map[string]接口{}
,或者甚至从你的
reflect
ed结构字段中构建查询…)如果我先选择年龄,然后选择姓名,例如选择年龄,那么上面的姓名是否会出现,即它是否有序?我相信是的。如果要反转查询,则对
err:=convertsign(dest[i],sv)
的调用将失败,
row.Scan
方法将返回错误,由于它无法将
int
转换为
string
,这使得反射无法实现这一点,因为您无法保证模型字段与数据库的列顺序同步(也不是没有学究性和不切实际性的),因此出于效率原因,我认为应该将其设置为尽可能低的级别。没有任何东西阻止您在其上实现对它的更用户友好/灵活的访问(例如,构建
map[string]接口{}
,甚至从
reflect
ed结构字段中构建查询…)可能有助于简化此过程。@elithrar谢谢这就是我要找的可能有助于简化此过程。@elithrar谢谢这就是我要找的