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

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

3 respostas

E aí, Guilherme!

Beleza? Olha, de cara, parece que o Gorm tá se perdendo no nome da tabela, né? Parece que ele tá esperando "people", mas a sua tabela é "person". Bicho teimoso!

A primeira coisa que me vem à mente é dar uma conferida na convenção de nomes que o Gorm segue. Por padrão, ele pluraliza os nomes das tabelas, então "Person" viraria "people". Mas, como sua tabela já é "person", pode ser que ele esteja se confundindo.

Duas ideias aqui: Você pode explicitar o nome da tabela no model usando a tag gorm:"tableName:person". Assim, ele não tenta pluralizar e vai direto ao ponto. Ficaria assim:

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

Se isso não resolver e você prefere manter a convenção padrão do Gorm, pode ser algo relacionado à configuração global. Às vezes, o Gorm pode estar configurado para pluralizar automaticamente os nomes das tabelas. Se for o caso, vale a pena dar uma olhada nas configurações iniciais do Gorm.

Ah, e já pensou em dar uma olhada no banco de dados pra ter certeza de que a tabela "person" tá lá mesmo? Às vezes, a gente esquece desse detalhe.

Dá uma tentada nessas sugestões e vê se alguma resolve esse imbróglio. Se não der certo, manda mais detalhes que a gente continua fuçando nisso. Boa sorte aí na luta contra o Gorm!

Opa, Estudante! Tudo certo e com você?

O problema é realmente esse, o gorm n ta fazendo o "Select * from" da tabela certa! Enviou abaixo um print do meu banco de dados para demonstrar como está o banco de dados.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Tentei fazer dessa forma como você me recomendou, e cheguei ao mesmo resultado.

Model:

type Person struct {
    gorm.Model
    Id       int    `json:"id"`
    Nome     string `json:"nome"`
    Historia string `json:"história" gorm:"tableName:persons"`
}

Erro:

2023/11/30 17:52:39 C:/Users/jhejh/go/src/github.com/GuilhermeMViana/go-api/controllers/controllers.go:19 ERROR: relation "people" does not exist (SQLSTATE 42P01)
[8.111ms] [rows:0] SELECT * FROM "people" WHERE "people"."deleted_at" IS NULL

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

Obrigado.

solução!

Fala Pessoal! Tudo bem com vocês? Espero que sim!

Sobre o problema do Guilherme, o erro relation "people" does not exist (SQLSTATE 42P01) está ocorrendo porque o GORM está tentando acessar uma tabela chamada people, mas no modelo declaramos o nome da tabela como persons.

Mas, por que isso está acontecendo? Também me perguntei isso por um tempo. Por padrão, o GORM usa o nome padrão da tabela baseado no plural do modelo, então Person se torna People.

Então, não se preocupe, podemos resolver isso em dois passos, passando mais um atributo nos métodos de busca, o .Table("nome-da-tabela") e ajustando o seu modelo no arquivo persons.go.

1 - Ajuste nos métodos de busca, adicionando o atributo .Table:

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

func IdFilter(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id := vars["id"]

    var personalidade models.Person
    database.DB.Table("persons").First(&personalidade, id)
    json.NewEncoder(w).Encode(personalidade)
}

Com o .Table conseguimos especificar qual é o nome da tabela que estamos tentando realizar determinado método, no seu caso é a busca.

2 - Ajuste no código presente no arquivo persons.go:

package models

type Person struct {
    Id       int    `json:"id"`
    Nome     string `json:"nome"`
    Historia string `json:"história"`
}

var Persons []Person

Ajustes aqui aplicados foram para retirar algumas configurações que você havia adicionado buscando definir o nome da tabela, mas poderia acabar gerando outro tipo de erro.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software