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

[Bug] Erro ao utilizar o método .Query na Jogoteca

Pessoal, bom dia!

Venho evoluindo na programação em Python e encontrei o seguinte erro durante o meu curso de Flask avançado:

Observações: Costumo alterar nomes chaves dentro dos projetos para que não fiquem meramente no CTRL+C e CTRL+V. No meu caso não se trata de uma Jogoteca, e sim de um repositório de instrumentos. Segue evidêcia do erro em anexo.!

Página 127.0.0.1:5000 com erro

Código do programa: **

from flask import Flask, render_template, request, redirect, session, flash, url_for
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.secret_key = 'alura'

app.config['SQLALCHEMY_DATABASE_URI'] = \
    '{SGBD}://{usuario}:{senha}@{servidor}/{database}'.format(
        SGBD='mysql+mysqlconnector',
        usuario='root',
        senha='xxxx',
        servidor='localhost',
        database='volt_instrumentos'
    )

db = SQLAlchemy(app)
class Maquinas(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    tag = db.Column(db.String(20), nullable=False)
    nome = db.Column(db.String(50), nullable=False)
    temperatura = db.Column(db.String(5), nullable=False)
    umidade = db.Column(db.String(10), nullable=False)

    def __repr__(self):
        return '<Name %r' % self.name


class Usuarios(db.Model):
    nickname = db.Column(db.String(8), primary_key=True)
    nome = db.Column(db.String(20), nullable=False)
    senha = db.Column(db.String(100), nullable=False)

    def __repr__(self):
        return '<Name %r' % self.name


@app.route('/')
def index():
    lista = Maquinas.query.order_by(Maquinas.id)
    return render_template('listaInstrumentos.html', titulo='Instrumentos', maquinas=lista)


@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('novo')))
    return render_template('novoInstrumento.html', titulo='Novo instrumento')


@app.route('/criar', methods=['POST', ])
def criar():
    tag = request.form['tag']
    nome = request.form['nome']
    temperatura = request.form['temperatura']
    umidade = request.form['umidade']

    maquina = Maquinas.query.filter_by(name=nome).first()

    if maquina:
        flash('Jogo já existente!')
        return redirect(url_for('index'))

    nova_maquina = Maquinas(tag=tag, nome=nome, temperatura=temperatura, umidade=umidade)
    db.session.add(nova_maquina)
    db.session.commit()


@app.route('/login')
def login():
    proxima = request.args.get('proxima')
    return render_template('login.html', titulo='Login', proxima=proxima)


@app.route('/autenticar', methods=['POST', ])
def autenticar():

    usuarios = Usuarios.query.filter_by(nickname=request.form['usuario']).first()

    if usuarios:
        if request.form['senha'] == usuarios.senha:
            session['usuario_logado'] = usuarios.nickname
            flash(usuarios.nickname + ' logado com sucesso!')
            proxima_pagina = request.form['proxima']
            if proxima_pagina != 'None':
                return redirect(proxima_pagina)

    else:
        flash('Falha no login')
        return redirect(url_for('login'))


@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Logout efetuado com sucesso')
    return redirect(url_for('index'))


app.run(debug=True)

Código de criação da tabela no SQL

# criando tabelas
TABLES = {}
TABLES['Instrumentos'] = ('''
      CREATE TABLE `instrumentos` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `tag` varchar(20) NOT NULL,
      `nome` varchar(50) NOT NULL,
      `temperatura` varchar(5) NOT NULL,
      `umidade` varchar(10) NOT NULL,
      PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;''')
2 respostas
solução!

Olá, Luciana! Tudo bem?

Com base na imagem que você compartilhou, parece que há um descompasso entre o nome da tabela definido no SQLAlchemy e o nome da tabela no banco de dados MySQL.

No SQLAlchemy, você definiu a classe Maquinas para mapear a tabela, e o erro indica que está tentando acessar uma tabela chamada maquinas, a qual não existe. Isso ocorre, pois no código SQL que você forneceu para a criação da tabela, o nome definido é instrumentos.

Para resolver esse problema, você deve garantir que o nome da tabela definido na classe do SQLAlchemy corresponda ao nome da tabela no banco de dados. No seu caso, você deveria alterar a classe Maquinas para refletir o nome correto da tabela, que é instrumentos.

Aqui está um exemplo de como você pode corrigir a classe Maquinas:

class Instrumentos(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    tag = db.Column(db.String(20), nullable=False)
    nome = db.Column(db.String(50), nullable=False)
    temperatura = db.Column(db.String(5), nullable=False)
    umidade = db.Column(db.String(10), nullable=False)

    def __repr__(self):
        return '<Name %r>' % self.nome  # Certifique-se de que está usando 'self.nome' e não 'self.name'

Note que eu também corrigi o método __repr__ para usar self.nome em vez de self.name, já que o atributo definido na classe é nome.

Após realizar essa correção, e nos outros trechos de código que utilizam desta classe, tente executar seu aplicativo novamente. Isso deve resolver o problema do erro ao tentar realizar a query na tabela que não estava sendo encontrada.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Obrigada, Armando!

Não imaginava que a classe deveria ter o mesmo nome que a tabela, mas faz todo sentido. Também ajustei o método repr e tudo voltou a funcionar!!