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



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

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?

当您尝试连接到数据库时,可能您的db变量是在您的主函数中创建的。问题是,db变量仅在主函数内具有作用域。因此,为了工作,你需要在包级别全局声明它。

所以在你的主。在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
}

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

如果db来自另一个包,确保它具有公共访问权限。您需要以大写字母开头,例如Db

这将是一个使用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. ")
}
}

最新更新