postgresql 如何在Golang中访问http处理程序中的数据库连接?

inb24sb2  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

我是Golang语言的新手,我来自Nodejs,在那里访问数据库和在http请求处理程序中操作db是相当简单的。现在我想在Golang中做同样的事情,但我不能从处理程序中访问db变量。假设我想从postgres数据库中获得用户的get请求。

func getHandler(w http.ResponseWriter, r *http.Request) {
     
    fmt.Fprintf(w, "get req made")
     
    rows, error := db.Query("SELECT id, name, age FROM new_table LIMIT $1", 4)
    if error != nil {
        panic(error)
    }
    defer rows.Close()
    for rows.Next() {
        var id int
        var name string
        var age int
        error = rows.Scan(&id, &name, &age)
        if error != nil {
            panic(error)
        }
        fmt.Println(id, name, age)
    }
    error = rows.Err()
    if error != nil {
        panic(error)
    }
}```
And i get error: undeclared name: db, if i use this code inside the main function where the db connection is located, its working fine.
How can i use the db variable outside the scope where its declared?
8cdiaqws

8cdiaqws1#

当你试图连接到数据库时,你的db变量可能是在你的主函数中创建的,问题是,db变量的作用域只在你的主函数中,所以为了工作,你需要在包级别全局声明它。
所以在你的main.go中声明一个main函数之外的变量,然后在任何地方使用它。

package main

var db *DB

func main() {
  var err error
  db, err = sql.Connect(...)
  if err != nil {
      log.Fatal(err)
  }
  defer db.Close()

  //Start HTTP server
}

但是如果你使用全局变量,你必须检查它是否支持多线程访问,你的数据库连接会工作的很好,但是你必须阅读一些关于变量作用域和互斥锁的教程。

pkwftd7m

pkwftd7m2#

如果db来自另一个包,请确保它具有公共访问权限。您需要以大写字母开头,例如Db
这是一个基本的数据库函数,位于www.example.com上的一个单独文件中gorm.io

package boot

import (
    "fmt"
    "log"
    "os"

    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

var DB *gorm.DB

func ConnectDB() {
    var err error
    dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=disable",
        os.Getenv("PG_HOST"),
        os.Getenv("PG_USER"),
        os.Getenv("PG_PASSWORD"),
        os.Getenv("PG_DBNAME"),
        os.Getenv("PG_PORT"),
    )
    DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        log.Println(err)
        panic("Failled to connect to Database. ")
    }

}

相关问题