Golang MySQL扫描仅在通过所有字段时填充结果
Golang mysqlGolang MySQL扫描仅在通过所有字段时填充结果,go,Go,Golang mysqlrow.Scan(&pointerAddress)不填充字段 当我发送请求时向我显示这一点,这样就可以了 如果我将所有用户结构字段填充到row.Scan(&User.Email等…)中,则仅在结果中显示值 代码: type User struct{ Id int `json:"id"` Email string `json:"email"` Password string `json:"passw
row.Scan(&pointerAddress)
不填充字段
当我发送请求时向我显示这一点,这样就可以了
如果我将所有用户结构字段填充到row.Scan(&User.Email等…)
中,则仅在结果中显示值
代码:
type User struct{
Id int `json:"id"`
Email string `json:"email"`
Password string `json:"password"`
Firstname string `json:"firstname"`
Lastname string `json:"lastname"`
RememberToken string `json:"remember_token"`
Phone int64 `json:"phone"`
AgreeTerms int8 `json:"agree_terms"`
AllowPromotionalOffers int8 `json:"allow_promotional_offers"`
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
LandlordId int64 `json:"landlord_id"`
RenterId int64 `json:"renter_id"`
}
我的登录功能:
func Login(w http.ResponseWriter, r *http.Request) {
user := models.User{}
err := json.NewDecoder(r.Body).Decode(&user)
if err != nil {
fmt.Println(err)
}
row, err := database.DB.Query("SELECT * FROM users WHERE email=?", user.Email)
if err != nil {
fmt.Errorf("%w", err)
}
defer row.Close()
for row.Next() {
err = row.Scan(&user.Id, &user.Email, &user.Password)
if err != nil {
fmt.Errorf("%w", err)
}
}
err = json.NewEncoder(w).Encode(user)
if err != nil {
fmt.Errorf("%w", err)
}
}
如果结果集是一个查询行(可能是一个结构片),请尝试在for语句中初始化结构: 如果使用的是QueryRow结果集,则不需要循环
row, err := database.DB.QueryRow("SELECT id, email, password FROM users WHERE email=?",
user.Email).Scan(&user.Id, &user.Email, &user.Password)
作为最佳实践,如果不是必需的,则应避免使用“*”。)
虽然有点冗长,但它可以工作。使用
,在json
标记中省略空的。请注意,这与SQL和行扫描有关。在Go中,当您初始化一个结构时,它的所有字段都被初始化为其类型的零值,并且仅仅因为没有显式设置它们并不意味着它们不存在,它们就存在。Go中没有“未定义”字段。谢谢,它更改了json响应,但是row.Scan(&user.Id)
显示为空,意味着不显示结果。我不确定您的评论是什么意思。请尝试更详细地解释新问题是什么。编辑问题并添加新代码、新输入和新输出。谢谢,已更新问题。请注意,database/sql
仅提供基本的sql内容。如果使用SELECT*FROM…
则必须以正确的顺序手动传递所有字段。如果使用从…
中选择id、电子邮件、名字、姓氏,则必须手动将相应的4个字段传递到扫描
。有一种方法可以绕过标准库。如果您不想这样做,您必须使用一些可以为您做的库,比如sqlx或其他类似ORM的东西。
row, err := database.DB.QueryRow("SELECT id, email, password FROM users WHERE email=?",
user.Email).Scan(&user.Id, &user.Email, &user.Password)