1
resposta

"invalid memory address or nil pointer dereference" ao acessar a variável BD

A minha função de conectar na base de dados está assim:

var (
    DB  *gorm.DB
    err error
)

func ConnectDatabase() {
    stringConnection := "host=localhost user=root password=root dbname=root port=5432 sslmode=disable"
    DB, err := gorm.Open(postgres.Open(stringConnection))

    if err != nil {
        panic(err.Error())
    }
    DB.AutoMigrate(&models.Student{})
}

E o meu Controller está assim:

func CreateStudent(c *gin.Context) {
    var student models.Student

    if err := c.ShouldBindJSON(&student); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "error": err.Error()})
        return
    }

    database.DB.Create(&student)
    c.JSON(http.StatusCreated, student)
}

Porém, estou tomando o erro de invalid memory address or nil pointer dereference.

Eu consegui resolver de duas maneiras.

A primeira foi fazer com que o método de conexão com o banco retornasse um ponteiro de gorm.DB, ficando assim:

func ConnectDatabase() *gorm.DB {
    stringConnection := "host=localhost user=root password=root dbname=root port=5432 sslmode=disable"
    DB, err := gorm.Open(postgres.Open(stringConnection))

    if err != nil {
        panic(err.Error())
    }
    DB.AutoMigrate(&models.Student{})

    return DB
}

A segunda maneira foi atribuindo diretamente a variável local de conexão com o banco a variável global BD, ficando assim:

var (
    DB  *gorm.DB
    err error
)

func ConnectDatabase() {
    stringConnection := "host=localhost user=root password=root dbname=root port=5432 sslmode=disable"
    con, err := gorm.Open(postgres.Open(stringConnection))

    if err != nil {
        panic(err.Error())
    }
    con.AutoMigrate(&models.Student{})

    DB = con
}

Poderiam me ajudar a entender o porquê de não funcionar conforme a primeira vez? Parece que a variável Global não está sendo setada.

1 resposta

Prezado, apanhei deste erro por quase um dia e descobri que estava esquecendo de chamar a função database.ConectaComBancoDeDados() no main. Na prática, quando lá no controller ele tenta acessar o banco de dados sem ele ter sido conectado. ` func main() {

database.ConectaComBancoDeDados()

// models.Personalidades = []models.Personalidade{
//     {Id: 1, Nome: "Nome 1", Historia: "Historia 1"},
//     {Id: 2, Nome: "Nome 2", Historia: "Historia 2"},
// }

fmt.Println("Iniciando o servidor")

routes.HandleRequest()

} `