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

我一直在尝试使用http://www.github.com/go-sql-driver/mysql执行查询并一直在关注本教程:https ://tutorialedge.net/golang/golang-mysql-tutorial/


现在本教程在 1 个自定义函数中完成了所有工作,但我尝试将打开数据库连接和查询本身拆分为单独的函数。我这样做的方式是这样的:


package main


import (

    "fmt"

    "database/sql"

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

)


type SqlResult struct {

  id int

}


var db *sql.DB


func 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 main


import (

    "fmt"

    "database/sql"

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

)


type SqlResult struct {

  id int

}


var db *sql.DB


func 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,但我想拆分功能。似乎每次我需要新查询时都打开数据库连接是正确的解决方案。


有谁知道我在第一个例子中做错了什么,如果是这样,我想要的正确方式是什么?


当年话下
浏览 125回答 1
1回答

Cats萌萌

“我想要的正确方式是什么?”package mainimport (    "database/sql"    "fmt"    _ "github.com/go-sql-driver/mysql")var db *sql.DBfunc 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)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go