Um momento
Aula 37
Cursos / Como Criar uma API JSON em Golang - CRUD Simples
Como Usar o DB Next Scan e Ler Registros do Banco de Dados MySQL - Aula de Golang (API)

Nesta aula nós aprendemos a fazer a leitura de registros depois de fazer uma consulta de MySQL.

O método que faz uma consulta retorna uma estrutura de registros. Há dois métodos importantes: um para identificar o próximo registro e outro para ler esse registro.

Depois de realizar a consulta com a função db.Query e lidar com qualquer erro de consulta, é hora de percorrer os registros e construir uma struct de Livro para cada linha.

Percorremos cada registro com um loop for na condição determinada pela chamada de registros.Next(), cujo chamador de função é o valor retornado pela chamada do db.Query.

Dentro do loop, podemos chamar a função Scan da mesma variável que contém os registros:

for registros.Next() {
  var livro Livro
  registros.Scan(&livro.Id, &livro.Autor, &livro.Titulo)
  ...
}

Os argumentos à Scan variam de acordo com o número de colunas retornado pela consulta realizada pelo db.Query. A ordem dos argumentos correspondem respectivamente à ordem das colunas escrita na declaração da consulta.

Criamos uma variável para armazenar cada Livro gerado pelo processamento da consulta. No final, como já estava antes, o codificador de JSON é usado para concluir a resposta.

Summary

Resumo da Aula de Go Long: Implementação da API

Nesta aula, o instrutor apresenta a implementação de uma API em Go para listar livros usando uma interface SQL (ISQL). Aqui estão os principais pontos abordados:

Alterações no Código

  • O instrutor removeu alguns comandos de impressão (Sprint LN) e rios configurados, permitindo um foco melhor no código de listagem.

Leitura de Resultados

  • O processo para listar livros envolve um loop para ler os resultados de uma consulta ao banco de dados.
  • O método Scan é utilizado para escanear resultados, e o instrutor explica como usar um loop for com Next para verificar se há mais registros a ler.

Estrutura do Livro

  • Um tipo livro é definido com três propriedades: id, autor e title.
  • A leitura de dados do banco preenche essas propriedades usando argumentos correspondentes no scan.

Tratamento de Erros

  • Se ocorrer um erro ao escanear os registros, o erro é logado e o programa pode optar por:
    • Retornar um código de erro 500 (Internal Server Error).
    • Ignorar o registro com erro e continuar para o próximo.

Armazenamento dos Livros

  • Uma fatia livros é criada para armazenar todos os livros lidos. O uso de append é demonstrado para adicionar novos livros à lista.

Fechamento de Registros

  • É enfatizada a importância de fechar a conexão com os registros após a leitura para liberar recursos.

Testes e Execução

  • O instrutor finaliza explicando a execução do servidor, realizando teste de integração com um cliente SQL para confirmar que os registros retornados da API estão corretos.

Considerações Finais

  • O apresentador observa um erro na ordem de uso do append e esclarece a necessidade de corrigir esses detalhes.
  • Ele finaliza a aula com a confirmação de que a API está funcionando conforme esperado, com registros vindos corretamente do banco de dados.

Essa aula abrange a implementação e o teste de uma API simples de listagem de livros utilizando Go e SQL, enfatizando boas práticas de tratamento de erros e gerenciamento de recursos.

Video Transcript

Lá pessoal estamos de volta mais uma aula de Go Long, implementação da API de auto-sum usando uma ISQL e vamos lá. Continuando aqui, eu vou tirar a Sprint LN na linha 47 e vou tirar a Sprint LN da linha 54 e também aqueles lá que configurar banco de dados embaixo aqui. Linha. Linhas 204 e 5. Vamos lá de volta para o listar livros. Depois, quando não tiver erro, depois da query, vamos ter que fazer um loop, uma repetição aqui para poder ler, fazer leitura dos resultados desses registros. A função que vai vir dos registros aqui vai ser o scan. Scan para escanear. Então vai ser o seguinte. Olha aqui, vamos fazer um for e dos resultados, dados, registros, tem um método chamado Next que você vai chamar. Bem, quando você chama o Next, ele vai te dizer se ainda tem algo para ler. Se tiver algo, vai ser verdadeiro e, portanto, vai executar a repetição. Na repetição, vamos fazer o seguinte. Vamos declarar uma variável para armazenar o livro. Vamos dar o livro do tipo livro. A gente já tinha lá em cima, se você lembra? Type livro. É uma estrutura que tem três propriedades de título e autor. Bem, temos esse livro declarado mais cadeias propriedades. Bem, as propriedades bancas vão vir do banco de dados. Dos registros, vamos chamar o scan. O scan vai levar um número de argumentos variado. Isto é, conta aqui quantas colunas você selecionou. No meu caso, uma, duas, três colunas lá do select. Portanto, o meu scan vai ser três argumentos. Então, eu vou passar o endereço do livro.id. %leave.autor. Note a correspondência. O id é o primeiro, autor é o segundo. E, finalmente, o livro.title com a % antes. Terceiro. Com isso, o scan vai retornar. Se der tudo certo, ele vai pegar e vai modificar o valor de livro. Vou entender com o autor e título com o resultado da linha da consulta. Se der problema, essa chamada retorna um erro. Eu falar erro diz scan. 2 pontos igual. 2 pontos igual que não vai ter problema, né? Então, veja que eu fiz um... Comenti um erro anteriormente, o 2 pontos igual na hora de definir o DB, né? Quando eu abri. Mas, nesse caso, está certo. Vamos checar aqui. Não sei se é parênteses, não. Tina, o erro não for news, tu é. Houve um erro. Vamos fazer o quê? Bem, nós fizemos a query e não teve problema. Mas, na hora de dar scan, aí que deu problema. Então, quem é ocupado aqui? Bem, talvez seja o servidor. Então, eu vou dizer log println, listar livros. Erro de scan. 2 pontos e erro de scan.error. Para mostrar mensagem. Eu vou logar o erro, mensagem de erro e vou fazer a mesma coisa, mesmo, né? Ou até... Bem, você poderia também mandar o código 500, internal server error. Erro de servidor interno. Ou você poderia apenas ignorar o registro e ir para o próximo, para a próxima repetição do for. Depende de como você quer fazer isso. Se eu fosse para ignorar o registro, aí no final, esse cara que não ia aparecer no resultado do API. Talvez seja legal, em vez de retornar 500, só retornar o usuário possivelmente. Uma lista vazia ou uma lista com os outros recordes, se somente esse recorde der problema. E os outros não der. Então, fazer isso, só dizer. Para poder ir para a próxima repetição, como é? Continue. Normalmente, nas linguagens, são continue. Então, vamos ver. E... Depois disso, o continue vai ir para o próximo, uma repetição. E se não ver, vamos continuar aqui. Depois de entrar, acho que esse erro se puder. Depois disso, se não tiver erro, isso significa que o livro vai estar com os dados. Mas, a gente quer retornar todos os livros. Então, a gente vai precisar de uma fatia de livros aqui. Então, vamos criar aqui em cima, vá livros no plural do tipo fatia-livro. Aí eu vou definir usando uma fatia de comprimento zero. Vou usar make, qual é o tipo fatia-livro, qual é o comprimento zero. Que aí não tem nenhum vazia, né? Importante isso, tá? Essa parte. Aí, o que é que eu vou fazer aqui? Eu vou apender o livro que foi lido, escaneado, na lista de livros. Bem, a lista de livros tem que atualizar, então vou colocar livro igual a append. Livro a livros. Isso vai ser a lista que estava assim, inicialmente. E eu pegasse um novo livro, iria pegar a lista, adicionar. E essa nova lista aqui, eu iria armazenar na livros. A livra de, sei lá, livro 1. E assim por diante. Ops. A append adiciona a coisa no final da lista. Tá bom? Depois disso, então aqui, os livros aqui que você está retornando, na verdade, vão ser esses livros aqui que a gente fez. Essa é a nova variável. Então, vou modificar o L mais ou menos, que não vai usar mais aquela variável do escopo global no modo. Tem também uma etapa de fechar a query. Se você ver aqui no documentação, KG, query, data base, SQL, index, cabel query do DB, query, query retorno esse, DB, query, bombê. Se você quisesse também fechar a conexão naquela hora, aqui, nos KD, rows, close. Aqui, esse que eu queria achar. Então, era o close do rows. Close, fecha os registros. Next, chamados, ok. Se o next, você chamar o next, e o next retornar false e não ter mais conjuntos, as registros são fechadas automaticamente. E você só precisa checar o resultado de erro. Então, esse detalhes, ele tem que você não precisa checar, depois do repetição, só precisa checar o erro. Não é eu vou fazer isso, ver. Ok, vamos lá. Depois de os registros, ponto, close, para fechar, aí, isso retorna o que é o erro, não é, se lembra? Error. Error de fechar registros. Esse deve de novo, sei lá, checa de novo, se não for nele, ah, o que é que eu vou fazer nesse caso? Esquisará o println, log println, tá ali os erro, fechar registros. Mais, se fechar registros, ponto, error. Só fazer isso mesmo, não vou mandar na arpousuária, ele não precisa saber disso, só precisa receber o livro. Então, só log interno mesmo. Finalmente, vamos testar isso. Controu o C, vai iniciar o servidor, poderia usar o compiler de, né, nesse caso já. Será que eu inverti? Ah, meu Deus, eu inverti o apen. É o contrário, né? Ah, vamos ver aqui. Isso que dá, sabe muito a linguagem, eu te esquece dos argumentos para a ordem. Se eu esquecer, deixa eu ver aqui, built in, append. Ah, então o append primeiro é o slice, a fatia que a gente quer adicionar. Desculpe, então. Então primeiro vai ser o slice, e o que vai ver os itens individualmente. Nesse caso, só tem um livro. Tá, então esse detalhe, primeiro é o slice. Primeiro é o slice. Vamos lá de novo, vamos usar o compiler de, né, compilera, daemon, traço build, igual o go install, traço command, do langa, api, gsacro, etc. Ah, isso está acontecendo porque eu tenho que criar tabela no mesmo direitório que o meu main.go, e ambos têm a função main declarada, então tem esse problema. Para poder consertar isso, teria que fazer mudar aqui, isso para outra coisa aqui, ou mudar de, para auto-package, ter que lidar com o negócio de modules, go modules, mas a gente não vai ter muito tempo para isso, então eu vou deixar no go run mesmo, desculpa. Era esse detalhe, por isso que eu não usei o compilera daemon. Vamos lá. Então, 200 OK. Será que realmente veio lá do mysgl? Deixa eu ver no meu, fazer uma detração aqui no meu cliente. Eu tenho select start from, vou fazer insert into beerus values auto-titul alguém aqui um titular go. OK. Adicionou aqui esse novo registro. Vamos ver se apareceu aqui quando deu o send. Realmente apareceu. Então está vindo do banco de dados mesmo. Está bom? Até por essa aula só e até a próxima. Tchau.
Nenhum comentário ainda (loading...)
Nenhum comentário ainda (loading...)
Gostou da aula? 😆👍
Apoie nosso trabalho com uma doação: