为了账号安全,请及时绑定邮箱和手机立即绑定

将数据库连接功能与查询功能分开

将数据库连接功能与查询功能分开

Go
当年话下 2022-07-11 10:39:05
我一直在尝试使用http://www.github.com/go-sql-driver/mysql执行查询并一直在关注本教程:https ://tutorialedge.net/golang/golang-mysql-tutorial/现在本教程在 1 个自定义函数中完成了所有工作,但我尝试将打开数据库连接和查询本身拆分为单独的函数。我这样做的方式是这样的:package mainimport (    "fmt"    "database/sql"    _ "github.com/go-sql-driver/mysql")type SqlResult struct {  id int}var db *sql.DBfunc main() {  dbConnection:= openDatabaseConnection();  getID(dbConnection);}func openDatabaseConnection() *sql.DB {  db,err:= sql.Open("mysql","username:password@tcp(127.0.0.1:3306)/test");  if err != nil {    panic(err.Error())  }  defer db.Close()  return db}func getID(db *sql.Db) {  results,err:= db.Query("SELECT id FROM test")  for results.Next() {    var result SqlResult    err=results.Scan(&result.id)    if err != nil {      panic(err.Error())    }    fmt.Print(result.id)  }}这不会打印出任何东西,但也不会给出错误。现在,当我将代码放入 1 个函数时,如下所示:package mainimport (    "fmt"    "database/sql"    _ "github.com/go-sql-driver/mysql")type SqlResult struct {  id int}var db *sql.DBfunc main() {  openDatabaseConnection();}func openDatabaseConnection() *sql.DB {  db,err:= sql.Open("mysql","username:password@tcp(127.0.0.1:3306)/test");  if err != nil {    panic(err.Error())  }  results,err:= db.Query("SELECT id FROM test")  for results.Next() {    var result SqlResult    err=results.Scan(&result.id)    if err != nil {      panic(err.Error())    }    fmt.Print(result.id)  }  defer db.Close()  return db}这会返回我所有的 id,但我想拆分功能。似乎每次我需要新查询时都打开数据库连接是正确的解决方案。有谁知道我在第一个例子中做错了什么,如果是这样,我想要的正确方式是什么?
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

“我想要的正确方式是什么?”


package main


import (

    "database/sql"

    "fmt"

    _ "github.com/go-sql-driver/mysql"

)


var db *sql.DB


func main() {

    db = openDatabaseConnection()

    defer db.Close()

    

    printIds(db)

}


func openDatabaseConnection() *sql.DB {

    db, err := sql.Open("mysql", "username:password@tcp(127.0.0.1:3306)/test")

    if err != nil {

        panic(err)

    } else if err := db.Ping(); err != nil {

        panic(err)

    }

    return db

}


func printIds(db *sql.DB) {

    rows, err := db.Query("SELECT id FROM test")

    if err != nil {

        panic(err)

    }

    defer rows.Close()

    

    for rows.Next() {

        var id int

        if err := rows.Scan(&id); err != nil {

            panic(err)

        }

        fmt.Println(id)

    }

    if err := rows.Err(); err != nil {

        panic(err)

    }

}


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信