You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:44:56