选择特定列时如何获取对应的字段?

时间:2019-06-25 04:18:58

标签: go sqlx

代码如下:

// User Model
type User struct {
    UserID        int           `db:"user_id"`
    UserNme       string        `db:"user_nme"`
    UserEmail     string        `db:"user_email"`
    UserAddressID sql.NullInt64 `db:"user_address_id"`
}
func (ur *userRepository) FindAll() ([]models.User, error) {
    var users []models.User
    query := "select user_nme from users"
    err := ur.Db.Select(&users, query)
    if err != nil {
        return nil, err
    }
    return users, nil
}

结果:

&[]models.User{models.User{UserID:0, UserNme:"Jay Durgan", UserEmail:"", UserAddressID:sql.NullInt64{Int64:0, Valid:false}}, models.User{UserID:0, UserNme:"Arne Balistreri", UserEmail:"", UserAddressID:sql.NullInt64{Int64:0, Valid:false}}, models.User{UserID:0, UserNme:"Greg Willms", UserEmail:"", UserAddressID:sql.NullInt64{Int64:0, Valid:false}}, models.User{UserID:0, UserNme:"Lady Aisha McLaughlin", UserEmail:"", UserAddressID:sql.NullInt64{Int64:0, Valid:false}}, models.User{UserID:0, UserNme:"Mrs. Phoebe Boyle", UserEmail:"", UserAddressID:sql.NullInt64{Int64:0, Valid:false}}}% 

如您所见,我没有查询user_iduser_emailuser_address_id列,但结果为这些字段提供了零值。

那么,有没有一种方法只能使字段对应于查询的列? 另外,我不想这样写:&user.userNme&user.xxx&user.xxx,这意味着写每个字段并填充它。太冗长了。

预期结果是:{UserNme: "Jay Durgan"} ...

2 个答案:

答案 0 :(得分:0)

您可以尝试

func (ur *userRepository) FindAll() ([]models.User, error) {
    users := []models.User{}.UserNme
    query := "select user_nme from users"
    err := ur.Db.Select(&users, query)
    if err != nil {
        return nil, err
    }
    return users, nil
}

您也可以点击此链接

http://go-database-sql.org/retrieving.html

答案 1 :(得分:0)

使用struct不能。

其他字段将仍然为零。这些字段是该结构的属性,因此无论是否需要,是否存储了从db操作检索到的值,所有字段都仍然存在。

针对您情况的唯一解决方案是使用地图,因此将仅检索对应字段的值。

var users []map[string]interface{}
query := "select user_nme from users"
err := ur.Db.Select(&users, query)
if err != nil {
    return nil, err
}

结果:

&[]map[string]interface{}{map[string]interface{}{UserNme:"Jay Durgan"}, ...}