go-mysql-driver

「已注销」 2019-12-16 02:46:28
简化代码如下

db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/utils?charset=utf8")
rows, err := db.Query("SELECT * FROM book")

执行到第二句时报错为runtime error: invalid memory address or nil pointer dereference
第一句填入的信息参照网上的例子为,用户名:密码@tcp(ip:端口)/数据库名
真正产生数据库连接在进行数据库操作时,即第二句,因此感觉可能是前面Open有点问题(执行这一句不会检测信息是否正确),毕竟也就这一句能和数据库扯得上关系
调试第二句进入的方法如下

rows, err := db.Query("SELECT * FROM book")
(*DB).Query: return db.QueryContext(context.Background(), query, args...)
(*DB).QueryContext: rows, err = db.query(ctx, query, args, cachedOrNewConn)
(*DB).query: dc, err := db.conn(ctx, strategy)
(*DB).conn: db.mu.Lock()
(*Mutex).Lock: if atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked) {
sigpanic: panicmem()
panicmem: panic(memoryError)




以下为完整代码

import (
"database/sql"
"errors"
"fmt"
_ "github.com/Go-SQL-Driver/MySQL"
"os"
"web/vo"
)

//定义一个全局的数据库驱动
var db *sql.DB

func init() {
//连接数据库,此时不会直接产生连接,只有当进行数据库操作时才会产生连接
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/utils?charset=utf8")
if err != nil {
fmt.Println("连接数据库失败", err)
os.Exit(1)
}
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(16)
}




func SearchAllBooks() (bookList []*vo.Book, err error) {
rows, err := db.Query("SELECT * FROM book")
if err != nil {
fmt.Println(err)
return
}
if rows == nil {
err = errors.New("查不到数据")
fmt.Println(err)
return
}
for rows.Next() {
var book *vo.Book = &vo.Book{}
err = rows.Scan(&book.Id, &book.Title, &book.Price)
if err != nil {
return
}
bookList = append(bookList, book)
}
return
}
...全文
58 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2019-12-17
  • 打赏
  • 举报
回复
引用 3 楼 qybao 的回复:
用gorm试试 import "github.com/jinzhu/gorm" var db *sql.DB 改成 var db *gorm.DB db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/utils?charset=utf8") 另外,把init方法改个名试试(init会在包加载时就执行),在main一开始直接调用试试
init到没有问题,就算全写在main函数里都是一样的问题,可能新版本方法改掉了,我想也不至于给这么重要个方法留个bug
qybao 2019-12-17
  • 打赏
  • 举报
回复
用gorm试试
import "github.com/jinzhu/gorm"

var db *sql.DB 改成 var db *gorm.DB
db, err := gorm.Open("mysql", "root:root@tcp(127.0.0.1:3306)/utils?charset=utf8")

另外,把init方法改个名试试(init会在包加载时就执行),在main一开始直接调用试试
「已注销」 2019-12-16
  • 打赏
  • 举报
回复
"root:root@tcp(127.0.0.1:3306)/utils?charset=utf8&serverTimezone=UTC" 这么设还是没用 无论mysql是否开启,报错都是一样的,多半开始连接之前就被打死了
「已注销」 2019-12-16
  • 打赏
  • 举报
回复
请问是否是因为mysql8的缘故,需要设时区呢??

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧