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

Erro na aula Persistindo informações no MySQL

Segui a dica e o código refatorado do tópico abaixo pois estava com dificuldade de realizar a instalação da versão do MySQL passado no curso acredito que devido ao Windows 10, ai com a dica deste post (https://cursos.alura.com.br/forum/topico-refatorar-codigo-para-usar-o-pymysql-98957) consegui continuar porem me deparei com o seguinte erro:

(venv) λ python "C:\Users\Igor Szot\Documents\Cursos2020\CursoPythonFlask\app1\app_jogoteca.py"
Traceback (most recent call last):
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 581, in connect
    sock = socket.create_connection(
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 808, in create_connection
    raise err
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 796, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] Nenhuma conexão pôde ser feita porque a máquina de destino as recusou ativamente

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\Igor Szot\Documents\Cursos2020\CursoPythonFlask\app1\app_jogoteca.py", line 4, in <module>
    db = pymysql.connect(host='localhost',
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 325, in __init__
    self.connect()
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 630, in connect
    raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([WinError 10061] Nenhuma conexão pôde ser feita porque a máquina de destino as recusou ativamente)")
8 respostas

Oi Igor, tudo bem com você?

Tente algumas possíveis soluções:

  • Verifique se suas credenciais de user e password do banco estão corretas.
  • Desligue o servidor do MySQL e o ligue novamente. Tente executar o código novamente.
  • Substitua o host, por: host = '127.0.0.1'. Tente executar o código novamente.

Fico no aguardo.

Oi Nadia, Obrigado pela ajuda, Mas mesmo assim o erro persiste :(

(venv) λ python banco.py
Traceback (most recent call last):
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 581, in connect
    sock = socket.create_connection(
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 808, in create_connection
    raise err
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 796, in create_connection
    sock.connect(sa)
ConnectionRefusedError: [WinError 10061] Nenhuma conexão pôde ser feita porque a máquina de destino as recusou ativamente

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "banco.py", line 4, in <module>
    connection = pymysql.connect(host='localhost',
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\__init__.py", line 94, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 325, in __init__
    self.connect()
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python38-32\lib\site-packages\pymysql\connections.py", line 630, in connect
    raise exc
pymysql.err.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([WinError 10061] Nenhuma conexão pôde ser feita porque a máquina de destino as recusou ativamente)")

Vou postar meus codigo, que estão praticamente iguais ao que foi passado

prepara_banco.py

import pymysql

conn = pymysql.connect(host='localhost',
                       user='seu_user',
                       password='seu_password')

# Descomente se quiser desfazer o banco...
# conn.cursor().execute("DROP DATABASE `jogoteca`;")
# conn.commit()


# Criando o banco de dados
conn.cursor().execute('CREATE DATABASE IF NOT EXISTS jogoteca')

conn.select_db('jogoteca')

# Criando tabelas no banco
cur = conn.cursor()

cur.execute("CREATE TABLE `jogo` (`id` int NOT NULL AUTO_INCREMENT,`nome` varchar(50) NOT NULL,`categoria` varchar(40)  NOT NULL,`console` varchar(20) NOT NULL,PRIMARY KEY (`id`))")

cur.execute("CREATE TABLE `usuario` (`id` varchar(8) NOT NULL,`nome` varchar(20) NOT NULL,`senha` varchar(8) NOT NULL,PRIMARY KEY (`id`))")

# inserindo usuarios

cur.executemany(
      'INSERT INTO jogoteca.usuario (id, nome, senha) VALUES (%s, %s, %s)',
      [
            ('luan', 'Luan Marques', 'flask'),
            ('nico', 'Nico', '7a1'),
            ('danilo', 'Danilo', 'vegas')
      ])

cur.execute('select * from jogoteca.usuario')
print(' -------------  Usuários:  -------------')
for user in cur.fetchall():
    print(user[1])

# inserindo jogos
cur.executemany(
      'INSERT INTO jogoteca.jogo (nome, categoria, console) VALUES (%s, %s, %s)',
      [
            ('God of War 4', 'Ação', 'PS4'),
            ('NBA 2k18', 'Esporte', 'Xbox One'),
            ('Rayman Legends', 'Indie', 'PS4'),
            ('Super Mario RPG', 'RPG', 'SNES'),
            ('Super Mario Kart', 'Corrida', 'SNES'),
            ('Fire Emblem Echoes', 'Estratégia', '3DS'),
      ])

cur.execute('select * from jogoteca.jogo')
print(' -------------  Jogos:  -------------')
for jogo in cur.fetchall():
    print(jogo[1])

conn.commit()
cur.close()

dao.py

from CursoPythonFlask.app1.app_jogoteca import Jogo, Usuario

SQL_DELETA_JOGO = 'delete from jogo where id = %s'
SQL_JOGO_POR_ID = 'SELECT id, nome, categoria, console from jogo where id = %s'
SQL_USUARIO_POR_ID = 'SELECT id, nome, senha from usuario where id = %s'
SQL_ATUALIZA_JOGO = 'UPDATE jogo SET nome=%s, categoria=%s, console=%s where id = %s'
SQL_BUSCA_JOGOS = 'SELECT id, nome, categoria, console from jogo'
SQL_CRIA_JOGO = 'INSERT into jogo (nome, categoria, console) values (%s, %s, %s)'


class JogoDao:
    def __init__(self, db):
        self.__db = db

    def salvar(self, jogo):
        cursor = self.__db.cursor()

        if (jogo.id):
            cursor.execute(SQL_ATUALIZA_JOGO, (jogo.nome, jogo.categoria, jogo.console, jogo.id))
        else:
            cursor.execute(SQL_CRIA_JOGO, (jogo.nome, jogo.categoria, jogo.console))
            jogo.id = cursor.lastrowid
        self.__db.commit()
        return jogo

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

    def busca_por_id(self, id):
        cursor = self.__db.cursor()
        cursor.execute(SQL_JOGO_POR_ID, (id,))
        tupla = cursor.fetchone()
        return Jogo(tupla[1], tupla[2], tupla[3], id=tupla[0])

    def deletar(self, id):
        self.__db.cursor().execute(SQL_DELETA_JOGO, (id, ))
        self.__db.commit()


class UsuarioDao:
    def __init__(self, db):
        self.__db = db

    def buscar_por_id(self, id):
        cursor = self.__db.cursor()
        cursor.execute(SQL_USUARIO_POR_ID, (id,))
        dados = cursor.fetchone()
        usuario = traduz_usuario(dados) if dados else None
        return usuario


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))


def traduz_usuario(tupla):
    return Usuario(tupla[0], tupla[1], tupla[2])

app_jogoteca.py

from flask import Flask, render_template, request , redirect, session, flash, url_for
import pymysql

db = pymysql.connect(host='localhost',
                       user='seu_user',
                       password='seu_password',
                       db='jogoteca')


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

linkdeteste = 'https://www.google.com.br/'

class Jogo:
    def __init__(self, nome, categoria, console):
        self.nome = nome
        self.categoria = categoria
        self.console = console

class Usuario:
    def __init__(self, id, nome, senha):
        self.id = id
        self.nome = nome
        self.senha = senha

usuario1 = Usuario('igor','Igor Szot','12345')
usuario2 = Usuario('luan', 'Luan Marques', '54321')
usuario3 = Usuario('Nico','Steppat','alemao')

usuarios = { usuario1.id: usuario1,
             usuario2.id: usuario2,
             usuario3.id: usuario3}

jogo1 = Jogo('Super Mario', 'Ação', 'SNES')
jogo2 = Jogo('Pokemon Gold', 'RPG', 'Game Boy')
jogo3 = Jogo('CSGO', 'FPS', 'PC')
lista = [jogo1,jogo2,jogo3]

@app.route('/')
def index():
    return render_template('lista.html', titulo= 'jogos', jogos= lista, link=linkdeteste)

@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('novo.html', titulo= 'novo jogo')

@app.route('/criar', methods=['POST',])
def criar():
    nome = request.form['nome']
    categoria = request.form['categoria']
    console = request.form['console']
    jogo = Jogo(nome, categoria, console)
    lista.append(jogo)
    return redirect(url_for('index'))

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

@app.route('/autenticar', methods=['POST',])
def autenticar():
    if request.form['usuario'] in usuarios:
        usuario = usuarios[request.form['usuario']]
        if usuario.senha == request.form['senha']:
            session ['usuario_logado'] = usuario.id
            flash(usuario.nome + ' logou com sucesso!')
            proxima_pagina =  request.form['proxima']
            return redirect(proxima_pagina)
    else :
        flash('Não logado, tente de novo!')
        return redirect (url_for('login'))

@app.route('/logout')
def logout():
    session['usuario_logado'] = None
    flash('Nenhum Usuario Logado')
    return redirect(url_for('index'))

app.run(debug=True)

Tambem tentei voltar a versão do python para o 3.6 e rodei o código passado no curso, e retornou esse erro.

python prepara_banco.py
Conectando...
Traceback (most recent call last):
  File "prepara_banco.py", line 3, in <module>
    conn = MySQLdb.connect(user='root', passwd='admin', host='localhost')
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python36\lib\site-packages\MySQLdb\__init__.py", line 84, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\Igor Szot\AppData\Local\Programs\Python\Python36\lib\site-packages\MySQLdb\connections.py", line 179, in __init__
    super(Connection, self).__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2002, "Can't connect to MySQL server on 'localhost' (10061)")
solução!

Igor, esse erro é porque o flask não está conseguindo fazer uma conexão com MySQL. Verifique se o MySQL está executando em sua máquina. Caso utilize o windows, tente dar um restart:

image

Caso utilize o linux, faça no terminal:

sudo service mysql restart

Outra solução, é explicitar a porta, dessa forma:

 pymysql.connect(host = 'localhost',
                       user = 'seu_user',
                       password = 'seu_password',
                       port = 3306,
                       db='jogoteca')

Me informe se o erro persiste. Fico no aguardo.

Nádia, agora foi, estava com problemas dentro do MySQL e resolvi aqui, Muito obrigado pela ajuda!