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.