1
resposta

Mensagem "WHERE conditions required"

Estou obtendo a mensagem "WHERE conditions required" nos testes de atualização do aluno. Apesar disso, o teste passa, porém queria saber o motivo disso estar acontecendo.

Meu código está assim:

Função de teste:

func TestAtualizarAluno(t *testing.T) {
    database.ConectaComBancoDeDados()
    CriaAlunoMock()
    defer excluiAlunoMock()
    r := SetupDasRotasDeTeste()
    r.PUT("/alunos/:id", controllers.EditaAluno)
    url := "/alunos/" + strconv.Itoa(ID)
    nomeAtualizado := "Nome atualizado"
    cpfAtualizado := "55555555555"
    rgAtualizado := "111111111"
    aluno := models.Aluno{Nome: nomeAtualizado, Cpf: cpfAtualizado, Rg: rgAtualizado}
    valorJson, _ := json.Marshal(aluno)
    req, _ := http.NewRequest("PUT", url, bytes.NewBuffer(valorJson))
    res := httptest.NewRecorder()
    r.ServeHTTP(res, req)

    var alunoMockAtualizado models.Aluno
    json.Unmarshal(res.Body.Bytes(), &alunoMockAtualizado)

    assert.Equal(t, nomeAtualizado, alunoMockAtualizado.Nome, "Nomes diferentes")
    assert.Equal(t, rgAtualizado, alunoMockAtualizado.Rg, "Rg diferente")
    assert.Equal(t, cpfAtualizado, alunoMockAtualizado.Cpf, "CPF diferente")
}

Controller de atualização:

func EditaAluno(c *gin.Context) {
    var aluno models.Aluno
    id := c.Params.ByName("id")
    database.DB.First(&aluno, id)

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

    if err := models.ValidaDadosDeAlunos(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "message": err.Error()})
        return
    }
    database.DB.Model(&aluno).UpdateColumns(aluno)
    c.JSON(http.StatusOK, aluno)
}
1 resposta

Olá, André! Como vai?

A mensagem "WHERE conditions required" que você está recebendo é uma mensagem de segurança do GORM, o ORM que você está usando para interagir com o banco de dados. Essa mensagem é exibida quando uma operação de atualização ou exclusão é realizada sem uma cláusula WHERE, o que poderia levar a atualizações ou exclusões em massa se não fosse intencional.

No seu caso, o problema está na função EditaAluno do seu controller. Quando você faz a chamada database.DB.First(&aluno, id), o GORM busca o aluno com o id fornecido e preenche o objeto aluno. No entanto, quando você faz a chamada database.DB.Model(&aluno).UpdateColumns(aluno), o GORM não tem uma cláusula WHERE para se basear, pois o objeto aluno foi preenchido com novos dados e o id original foi sobrescrito.

Uma solução para o seu problema seria armazenar o id do aluno em uma variável separada antes de preencher o objeto aluno com os novos dados. Aqui está um exemplo de como você poderia modificar a função EditaAluno:

func EditaAluno(c *gin.Context) {
    var aluno models.Aluno
    id := c.Params.ByName("id")
    database.DB.First(&aluno, id)

    // Armazene o ID do aluno antes de preencher o objeto aluno com os novos dados.
    alunoID := aluno.ID

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

    if err := models.ValidaDadosDeAlunos(&aluno); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{
            "message": err.Error()})
        return
    }

    // Use o ID do aluno armazenado para a operação de atualização.
    database.DB.Model(&models.Aluno{ID: alunoID}).Updates(aluno)
    c.JSON(http.StatusOK, aluno)
}

Espero ter ajudado e bons estudos!