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

Recuperando dados do banco

Boa tarde. Estou em dúvida na parte de recuperar os dados no banco. No curso não foi explicado de forma detalhada como foi recuperado o resultado da query do banco e passado para o objeto. Estou com um projeto para realizar uma listagem em um painel de determinados pacientes de uma view que foi criada no banco de dados, mas não estou conseguindo passar os dados recuperados para o objeto que criei. Alguém poderia me explicar?

4 respostas

Luiz, boa tarde. Tudo bem?

Não sei em qual parte do curso você está, deixarei uma explicação com os arquivos da aula 5. Tudo bem?!

No arquivo dao.py é feito a recuperação dos dados do banco. Vamos pegar como exemplo o método listar da classe JogoDao:

    def listar(self):
        cursor = self.__db.connection.cursor()
        cursor.execute(SQL_BUSCA_JOGOS)
        jogos = traduz_jogos(cursor.fetchall())
        return jogos

Neste método, na segunda linha conectamos ao banco. Já na terceira, executamos um sql responsável por nos retornar os dados do banco, que irá pegar o id, nome, categoria e console da tabela jogo:

SQL_BUSCA_JOGOS = 'SELECT id, nome, categoria, console from jogo'

Na quarta linha, utilizamos o método traduz_jogos para formatar os dados da forma como queremos, pois, o resultado do nosso sql será uma tupla de tuplas, algo como:

((4, 'Super Mario', 'RPG', 'SNES'), (32, 'FIFA', 'Esporte', 'SNES'))

E para destrinchar isto, retornamos no método traduz_jogos uma instancia da classe Jogo, que possui como atributos nome, categoria, console e id.

Isto será útil para que consigamos acessar um jogo por seu atributo, por exemplo:

  • nome: jogo.nome
  • categoria: jogo.categoria e assim por diante.

Agora, no arquivo view.py é feito uma instanciação da classe JogoDao e passado como parâmetro uma instância do nosso banco. Pegando agora como exemplo a rota de index:

@app.route('/') 
def index():
    lista = jogo_dao.listar()
    return render_template('lista.html', titulo='Jogos',
                           jogos=lista)

Observe o seguinte: chamamos o nosso método listar e para renderizar o template de lista.html, passamos um parâmetro nomeado de "jogos" que recebe o conteúdo da função listar· Com isso, fizemos o seguinte:

  • Recuperamos os dados do banco através do método listar
  • Passamos estes dados para o arquivo lista.html

Sendo assim, precisamos mostrar estes dados no arquivo lista.html. Certo?!

E para isso, fazemos uma estrutura de repetição, pois, o método listar irá nos retornar uma lista de jogos. Lembrando que, como formatamos os dados, podemos acessá-los por meio de seus atributos: jogo.nome, jogo.categoria...

 {% for  jogo in jogos %}
                <tr>
                    <td>{{ jogo.nome }}</td>
                    <td>{{ jogo.categoria }}</td>
                    <td>{{ jogo.console }}</td>
                </tr>
            </tbody>
   {% endfor %}

Este é o processo para recuperar os dados do banco e mostrá-los na tela. Caso ainda tenha ficado algum resquício de dúvida, não hesite em perguntar. Estou a disposição.

E caso esteja ocorrendo algum erro no seu código, compartilhe-o conosco para que possamos ajudá-lo.

Espero ter ajudado. Abraços e bons estudos!

Bom dia, Nadia. Tudo bem, e você?

O que estou tendo dúvidas seria justamente no método traduz_jogos. Estou fazendo um projeto próprio que preciso retornar do banco uma lista de pessoas e o resultado do banco está vindo no formato de tupla, como você disse. Queria entender melhor o método traduz_jogos para conseguir replicar, pois ao tentar colocar o método no meu projeto, não estou conseguindo, acho que por falta de entendimento de como ele está funcionando.

Muito obrigado.

solução!

Luiz, tudo bem por aqui também :)

Entendi o ponto da sua dúvida. Então vamos lá:

  • Primeiro, por que o método traduz jogos é utilizado?

O resultado do fetchall() irá nos retornar uma tupla com os resultados que há no nosso banco, mas como temos uma classe que é o modelo do nosso banco ou seja, na nossa classe de Jogo possuímos todos os atributos que nossa tabela jogo no banco possui, podemos instanciar a classe Jogo através dos atributos que inserimos no banco para que mais a frente consigamos acessar: jogo.nome, jogo.categoria e assim por diante e isso só é possível por causa do método traduz_jogos.

Função traduz_jogos:


def traduz_jogos(jogos):
    def cria_jogo_com_tupla(tupla):
        return Jogo(tupla[1], tupla[2], tupla[3], id=tupla[0])
    return list(map(cria_jogo_com_tupla, jogos))

Observe que ela recebe como parâmetro o resultado no fetchall() ou seja, uma tupla com todos os valores que temos inseridos no banco. Mas, antes observe que temos uma função dentro de outra.

  • Temos a função traduz_jogos e dentro da traduz_jogos temos a cria_jogo_com_tupla

A rotina desse programa é o seguinte:

  • Entrou na função traduz_jogos

  • O que a função traduz_jogos retorna?

  • Ela retorna list(map(cria_jogo_com_tupla, jogos))

  • Mas o que isso faz?

  • A função map serve para aplicarmos uma função a cada um dos elementos passados como parâmetro, desde que este elemento seja um dado iterável(tupla, lista, etc...) Ela tem a seguinte estrutura:

    • map(função aplicada, lista_de_elementos)
    • Porém esta função nos retorna um objeto do tipo map e como isso será algo incompreensível, convertermos o resultado da função map para um objeto do tipo list que é algo que entendemos.
  • Então basicamente o que esta linha: list(map(cria_jogo_com_tupla, jogos)) faz é aplicar a função cria_jogo_com_tupla para cada item da tupla de tuplas que o fetchall nos retorna.

Vamos a um exemplo. Suponha que o fetchall() irá nos retornar o seguinte:

((4, 'Super Mario', 'RPG', 'SNES'), (32, 'FIFA', 'Esporte', 'SNES'))
  • Então nossa função traduz_jogos recebeu como parâmetro o resultado acima.

  • E o que a função traduz_jogos retorna?

  • Ela chama a função cria_jogo_com_tupla para cada item da lista.

  • E qual o primeiro item da lista?

  • (4, 'Super Mario', 'RPG', 'SNES')

  • Então ela chama a função cria_jogo_com_tupla para este elemento e dentro desta função pegamos cada item da tupla acessando-os pelo índice e retornarmos uma instância da nossa classe Jogo com os parâmetros do banco.

  • Depois a função map chamará a função cria_jogo_com_tupla para o segundo elemento e assim por diante...

Ficou mais claro?

Qualquer ponto que não tenha entendido é só falar.

Espero ter ajudado. Abraços e bons estudos!

Bom dia, Nadia.

Ficou claríssima a explicação agora.

Entendi perfeitamente e consegui já aplicar no meu projeto. Muitíssimo obrigado pela explicação e disponibilidade. Me ajudou demais.