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 吗?

另外,如果密码中包含 @ 符号,你可能需要对其进行转义。

最后但同样重要的是……通常,如果你能执行以下操作可能会有所帮助:

  1. 描述你的问题,而不仅仅是贴一些代码。告诉我们你的代码产生了什么输出,以及你期望得到什么。
  2. 确保检查代码中所有可能的 error 返回值。
  3. 使用 Markdown 格式使你的帖子易于阅读。

我不太确定你提到的密码具体指什么……

不过,你检查过 row.Scan 的返回值吗?

另外,你只能使用一些基本类型或实现了 Scanner 的类型作为 row.Scan 的参数。users 既不是基本类型,也没有实现任何方法,所以它也不是一个 Scanner

这很可能就是你看到零值的原因。

此外,你的查询只选择了 password 列,而你却试图将其赋值给一个 users 结构体。我猜 password 列包含的是一个 string 类型的数据……

func main() {
    fmt.Println("hello world")
}

你的代码中存在几个问题,我来逐一指出并提供修正后的示例:

  1. 占位符语法错误:MySQL使用?作为占位符,而不是$1
  2. 结构体字段可见性:结构体字段需要首字母大写才能被Scan()方法访问
  3. 错误处理缺失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格式化输出结构体所有字段
回到顶部