mysql - golang MySQL segfaulting 一旦抽象
问题描述
基本上,我试图对 sql.db 结构进行抽象,以便为它编写我自己的函数。但是,当我尝试这样做时,它会不断出现段错误,我不知道为什么。本质上,我有一个名为 ExtendedDB 的 sql.db 抽象,它是一个包含 sql.db 的结构。我这样做是为了编写我自己的函数来作用于 ExtendedDB 结构。对它的处理发生在 mysqlhandler.go 我对较低级别的编程相对较新,所以我认为它与指针处理不当有关。任何帮助表示赞赏!
编辑:当我调用 rows.Columns() 以验证查询是否通过时,第 25 行令人恐慌。然而,奇怪的是,在调试时它会将行识别为 *sql.rows 类型,这是正确的。此外,我知道它不会出错,就好像我err != nil
检查它通过了一样。
main.go
package main
import (
"fmt"
"log"
"os"
"github.com/blackcoffee77/tuilight/dbhandlers"
_ "github.com/go-sql-driver/mysql"
"github.com/joho/godotenv"
)
func main() {
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
conn := os.Getenv("DATABASE_CONN")
edb := dbhandlers.DBInit(conn)
fmt.Println("here2")
fmt.Printf("%T", edb.DB)
rows, _ := edb.DB.Query("select * from people where id = ?", 1)
fmt.Println(rows.Columns())
edb.GetAll()
fmt.Println("here6")
}
mysqlhandler.go
package dbhandlers
import (
"database/sql"
"fmt"
"log"
)
type ExtendedDB struct {
DB *sql.DB
Conn string
}
func (edb *ExtendedDB) getTables() *sql.Rows {
fmt.Println("here5")
res, _ := edb.DB.Query("select * from people where id = ?", 1)
fmt.Println("here4")
fmt.Println(res)
return res
}
func (edb *ExtendedDB) GetAll() {
tables := edb.getTables()
fmt.Println("here3")
fmt.Println(tables)
// fmt.Println(tables.Columns())
}
func DBInit(conn string) *ExtendedDB {
db, err := sql.Open("mysql", conn)
if err != nil {
log.Fatal(err)
}
defer db.Close()
fmt.Println("got here")
err = db.Ping()
if err != nil {
log.Fatal(err)
}
edb := ExtendedDB{DB: db, Conn: conn}
return &edb
}
解决方案
“ deferDBinit
db.Close()”函数退出时与数据库断开连接
推荐阅读
- sql - 使用 SQL woocommerce 批量隐藏重复的产品
- authorization - 如何在 net core 3 和身份服务器上使用 create react app -auth 模板接收当前用户
- apache - Apache 2.4 WebDAV 和 MS Word 身份验证
- php - 使用 PHP MySQL mysqli 从两个数据库中获取数据
- powershell - 添加一个计数器以显示在每个电子邮件标题上,并在 24 小时后重置
- laravel - 405(不允许的方法)- Laravel 和 Vue.Js
- powershell - 我将如何重写这个硬币翻转循环
- python - 如何(字面上)逐字符读取文件?
- jquery-ui - 是否有与 JqueryUI 等效的 HTML DOM 可选?
- javascript - 使用电子在 app.asar 中包含额外文件