首页 > 解决方案 > 将数据库连接功能与查询功能分开

问题描述

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

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

标签: mysqlgo

解决方案


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

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)
    }
}

推荐阅读