选择特定列时如何获取对应的字段?
How to get corresponding fields when selecting specific columns?
代码如下:
// 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"}
...
你可以试试这个
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
}
你也可以关注这个link
通过使用结构,你不能。
其他字段仍将保留为零值。这些字段是结构的 属性,因此无论您是否需要它,无论它是否存储从数据库操作中检索到的值,所有字段仍然存在。
您的情况的唯一解决方案是使用地图,因此只会检索相应字段的值。
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"}, ...}
代码如下:
// 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"}
...
你可以试试这个
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
}
你也可以关注这个link
通过使用结构,你不能。
其他字段仍将保留为零值。这些字段是结构的 属性,因此无论您是否需要它,无论它是否存储从数据库操作中检索到的值,所有字段仍然存在。
您的情况的唯一解决方案是使用地图,因此只会检索相应字段的值。
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"}, ...}