Как получить соответствующие поля при выборе конкретных столбцов? - PullRequest
0 голосов
/ 25 июня 2019

Вот код:

// 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_id, user_email и user_address_id столбцов, но результат дает мне эти поля с нулевым значением.

Итак, есть ли способ получить только поля, соответствующие запрашиваемым столбцам?Кроме того, я не хочу писать это так: &user.userNme, &user.xxx, &user.xxx, что означает запись каждого поля и его заполнение.Это слишком многословно.

Ожидаемый результат: {UserNme: "Jay Durgan"} ...

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Используя 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"}, ...}
0 голосов
/ 25 июня 2019

Вы можете попробовать это

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

...