使用GORM迁移PostgreSQL表失败,触发空指针恐慌求助
问题
我在supabase.com创建了PostgreSQL数据库,计划通过GORM将其连接到我的Golang项目,但执行表迁移操作时触发了错误。
相关代码
database.go
package initializers import ( "fmt" "log" "os" "gorm.io/driver/postgres" "gorm.io/gorm" ) var DB *gorm.DB func ConnectToDB() { var err error dsn := os.Getenv("DB_URL") DB, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(DB, "Failed to connect to database") } else { fmt.Println(DB, "Database connection established successfully") } }
migrate.go
package main import ( "GinGorm/initializers" "GinGorm/models" ) func init() { initializers.LoadEnvVariables() initializers.ConnectToDB() } func main() { post := &models.Post{} initializers.DB.Debug().AutoMigrate(post) }
执行命令及错误信息
执行命令:go run migrate/migrate.go
抛出错误:
&{0xc0001ce480 0 0xc00005f6c0 1} Database connection established successfully panic: runtime error: invalid memory address or nil pointer dereference [signal 0xc0000005 code=0x0 addr=0x28 pc=0xc19372] goroutine 1 [running]: gorm.io/gorm.(*DB).getInstance(0x70?) C:/Users/harsh/go/pkg/mod/gorm.io/gorm@v1.25.12/gorm.go:406 +0x12 gorm.io/gorm.(*DB).Debug(0x0) C:/Users/harsh/go/pkg/mod/gorm.io/gorm@v1.25.12/gorm.go:329 +0x18 main.main() D:/Code/Go/gin/GinGorm/migrate/migrate.go:15 +0x2e exit status 2
问题原因
ConnectToDB函数里的DB, err := gorm.Open(...)使用了短变量声明(:=),这会创建一个局部变量DB,而非给包级全局变量initializers.DB赋值。全局变量DB始终为nil,所以在main函数中调用initializers.DB.Debug()时,会触发nil指针解引用的panic。
解决方案
将ConnectToDB函数里的短变量声明改为赋值操作,去掉冒号:
修改后的database.go:
package initializers import ( "fmt" "log" "os" "gorm.io/driver/postgres" "gorm.io/gorm" ) var DB *gorm.DB func ConnectToDB() { var err error dsn := os.Getenv("DB_URL") // 去掉冒号,直接给全局变量DB赋值 DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal("Failed to connect to database") } else { fmt.Println("Database connection established successfully") } }
另外可以去掉log.Fatal里的DB参数,连接失败时它本身就是nil,打印没有实际意义。
内容的提问来源于stack exchange,提问作者khoprutu
相关产品推荐
相关产品推荐

