Golang中使用db.Close()无法关闭数据库连接怎么办

Golang中使用db.Close()无法关闭数据库连接怎么办 大家好,

我正在尝试设置一个数据库连接,并希望在最后使用 defer db.DB.Close()db.Close(),但两者对我来说都不起作用。

在我的以下代码中,它告诉我:未解析的引用 ‘Close’。

有人能帮我解决这个问题吗?那将非常棒 🙂

package database

import (
	"github.com/joho/godotenv"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"log"
	"os"
)

var db *gorm.DB

func LoadingEnv() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading EnvFile")
	}
}

func InitDatabase() {
	LoadingEnv()
	dbConnStr := os.Getenv("DB_CONN_STR")
	if dbConnStr == "" {
		log.Fatal("Wrong ConnectionString")
	}
	var err error
	db, err = gorm.Open(postgres.Open(dbConnStr), &gorm.Config{})
	if err != nil {
		log.Fatal("Error opening DB connection")
	}
	defer db.DB.Close() // Access the underlying sql.DB instance and call Close
}

干杯


更多关于Golang中使用db.Close()无法关闭数据库连接怎么办的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

感谢两位,你们真的帮了我很多 😊

抱歉回复晚了。

祝大家周末愉快。

更多关于Golang中使用db.Close()无法关闭数据库连接怎么办的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


  • 请参考您所使用的特定数据库交互库或框架。关闭连接的方法可能与 db.Close() 不同。例如,在使用 Postgres 的 Gorm v2 中,没有 db.Close() 方法,而是使用 DB() 来获取底层连接。

你好。*gorm.DB 结构体并没有名为 DB 的字段。它有一个 DB() 方法,该方法返回底层的连接和错误。通过这种方式,你可以获取到连接并关闭它。

但也要注意,sql 包会自行处理连接:

sql 包会自动创建和释放连接;

在Golang中,gorm.DB 不直接提供 Close() 方法。要关闭数据库连接,你需要通过 DB() 方法获取底层的 *sql.DB 实例,然后调用其 Close() 方法。以下是修正后的代码:

package database

import (
	"github.com/joho/godotenv"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"log"
	"os"
)

var db *gorm.DB

func LoadingEnv() {
	err := godotenv.Load()
	if err != nil {
		log.Fatal("Error loading EnvFile")
	}
}

func InitDatabase() {
	LoadingEnv()
	dbConnStr := os.Getenv("DB_CONN_STR")
	if dbConnStr == "" {
		log.Fatal("Wrong ConnectionString")
	}
	var err error
	db, err = gorm.Open(postgres.Open(dbConnStr), &gorm.Config{})
	if err != nil {
		log.Fatal("Error opening DB connection")
	}
	
	// 获取底层 sql.DB 实例
	sqlDB, err := db.DB()
	if err != nil {
		log.Fatal("Error getting sql.DB instance")
	}
	defer sqlDB.Close()
}

如果你需要在其他地方关闭连接,可以创建一个专门的关闭函数:

func CloseDatabase() error {
	if db != nil {
		sqlDB, err := db.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}

然后在主函数中使用:

func main() {
	database.InitDatabase()
	defer database.CloseDatabase()
	
	// 你的业务逻辑代码
}

这样就能正确关闭数据库连接了。

回到顶部