Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Gorm falha ao buscar no banco de dados.

Me deparei com um problema ao fazer requisição no banco de dados usando o gorm, ao tentar acessar a página que deveria me devolver os dados do meu banco de dados, ele me retorna um erro dizendo que não foi possível dar o select na tabela "people" mas a minha tabela chama "person".

Erro:

ERROR: relation "people" does not exist (SQLSTATE 42P01)
[2.066ms] [rows:0] SELECT * FROM "people" WHERE "people"."deleted_at" IS NULL

Arquivo db:

var (
    DB  *gorm.DB
    err error
)

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

    if err != nil {
        log.Fatal("Problema ao conectar com banco de dados:", err)
    } else {
        fmt.Println("Sucesso ao conectar com o banco de dados.")
    }

Meu model:

type Person struct {
    gorm.Model
    Id       int    `json:"Id"`
    Nome     string `json:"Nome"`
    Historia string `json:"História"`
}

Função que deveria fazer a pesquisa:

func AllPersons(w http.ResponseWriter, r *http.Request) {
    var p []models.Person
    database.DB.Find(&p)
    json.NewEncoder(w).Encode(p)
}

Link do código no github: https://github.com/GuilhermeMViana/go-api

2 respostas

E aí! Pelo que você compartilhou, o problema é que o GORM está tentando procurar uma tabela chamada "people" no banco de dados, mas na verdade, sua tabela se chama "person". Então, a consulta SQL está falhando porque não consegue encontrar essa tabela "people".

Vamos consertar isso!

No seu modelo, você tem:

type Person struct {
    gorm.Model
    Id       int    `json:"Id"`
    Nome     string `json:"Nome"`
    Historia string `json:"História"`
}

E no seu código da função:

func AllPersons(w http.ResponseWriter, r *http.Request) {
    var p []models.Person
    database.DB.Find(&p)
    json.NewEncoder(w).Encode(p)
}

A primeira coisa que você deve fazer é garantir que o GORM saiba que a tabela correspondente ao modelo Person é chamada "person" e não "people". Você pode fazer isso ao definir o nome da tabela no GORM:

func (p *Person) TableName() string {
    return "person"
}

Adicione essa função no seu modelo Person. Com essa alteração, o GORM saberá que, quando estiver trabalhando com o modelo Person, deve procurar pela tabela "person" no banco de dados.

Depois de fazer essa alteração, tente executar sua função AllPersons novamente e veja se resolve o problema. Isso deve fazer com que o GORM procure na tabela correta e retorne os resultados esperados!

solução!

Opa, Guilherme!

Acabei de respondê-lo em um tópico anterior seu acerca desse problema, estarei deixando um link logo abaixo para o tópico em questão.

Bons estudos!