Golang获取数据库数据时遇到问题,求帮助!
Golang获取数据库数据时遇到问题,求帮助!
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
type users struct {
id int
username string
password string
email string
first_name string
last_name string
created_at string
super_user bool
}
func main() {
db, err := sql.Open("mysql", "root:Megamind@1@(127.0.0.1:3306)/note?parseTime=true")
if err != nil {
log.Fatalln("Couldn't connect to the database")
}
var user users
row := db.QueryRow("select password from users where username=$1", "someone")
row.Scan(&user.password)
fmt.Println(user)
}
更多关于Golang获取数据库数据时遇到问题,求帮助!的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
很抱歉之前没有正确描述问题,感谢你提供帮助。
我想获取用户的哈希密码,但在尝试打印用户名是否正确时,打印结果却显示结构的零值。 例如:{0 false}
func main() {
fmt.Println("hello world")
}
更多关于Golang获取数据库数据时遇到问题,求帮助!的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
row.Scan 返回一个 error,它是 nil 吗?
另外,如果密码中包含 @ 符号,你可能需要对其进行转义。
最后但同样重要的是……通常,如果你能执行以下操作可能会有所帮助:
- 描述你的问题,而不仅仅是贴一些代码。告诉我们你的代码产生了什么输出,以及你期望得到什么。
- 确保检查代码中所有可能的
error返回值。 - 使用 Markdown 格式使你的帖子易于阅读。
你的代码中存在几个问题,我来逐一指出并提供修正后的示例:
- 占位符语法错误:MySQL使用
?作为占位符,而不是$1 - 结构体字段可见性:结构体字段需要首字母大写才能被
Scan()方法访问 - 错误处理缺失:
QueryRow()和Scan()都可能返回错误,需要处理
修正后的代码:
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
type User struct {
ID int
Username string
Password string
Email string
FirstName string
LastName string
CreatedAt string
SuperUser bool
}
func main() {
db, err := sql.Open("mysql", "root:Megamind@1@(127.0.0.1:3306)/note?parseTime=true")
if err != nil {
log.Fatalf("Couldn't connect to the database: %v", err)
}
defer db.Close()
// 测试数据库连接
if err := db.Ping(); err != nil {
log.Fatalf("Database connection failed: %v", err)
}
var user User
// 使用 ? 作为MySQL的占位符
row := db.QueryRow("SELECT password FROM users WHERE username = ?", "someone")
// 处理Scan可能返回的错误
err = row.Scan(&user.Password)
if err != nil {
if err == sql.ErrNoRows {
log.Println("No user found with that username")
} else {
log.Fatalf("Error scanning row: %v", err)
}
return
}
fmt.Printf("Password: %s\n", user.Password)
}
如果你需要查询完整的用户信息:
var user User
row := db.QueryRow("SELECT id, username, password, email, first_name, last_name, created_at, super_user FROM users WHERE username = ?", "someone")
err = row.Scan(
&user.ID,
&user.Username,
&user.Password,
&user.Email,
&user.FirstName,
&user.LastName,
&user.CreatedAt,
&user.SuperUser,
)
if err != nil {
log.Fatalf("Error scanning row: %v", err)
}
fmt.Printf("User: %+v\n", user)
主要修改点:
- 将结构体字段改为大写以导出
- 将
$1占位符改为? - 添加了错误处理和数据库连接测试
- 添加了
defer db.Close()确保资源释放 - 使用
%+v格式化输出结构体所有字段


