Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Usando sqlite3 ao inves de MySQLdb

Se alguém não sabe/ não pode/ não consegue instalar o MySQLdb, eu consegui utilizar o sqlite3 para fazer o curso.

O sqlite3 já faz parte do Python, tem suas particularidades, mas é bem parecido com o MySQLdb.

Aprendi a usá-lo nesse livro, que também tem outras dicas sobre python: https://python101.pythonlibrary.org/chapter18_sqlite.html

1 resposta
solução!

Segue o código:

prepara_banco_SQLite.py:

import sqlite3
print('Conectando...')
conn = sqlite3.connect("jogoteca.db")

cursor = conn.cursor()

try:
  cursor.execute('DROP TABLE jogo')
except sqlite3.OperationalError:
  pass

try:
  cursor.execute('DROP TABLE usuario')
except sqlite3.OperationalError:
  pass

criar_tabelas = '''
    CREATE TABLE `jogo` (
      `id` INTEGER PRIMARY KEY AUTOINCREMENT,
      `nome` varchar(50) NOT NULL,
      `categoria` varchar(40) NOT NULL,
      `console` varchar(20) NOT NULL
    );'''

try:
  cursor.execute(criar_tabelas)
except sqlite3.OperationalError:
  pass

criar_tabelas = '''
    CREATE TABLE `usuario` (
      `id` varchar(8) NOT NULL,
      `nome` varchar(20) NOT NULL,
      `senha` varchar(8) NOT NULL,
      PRIMARY KEY (`id`)
    );'''

try:
  cursor.execute(criar_tabelas)
except sqlite3.OperationalError:
  pass

# inserindo usuarios
cursor.executemany(
      'INSERT INTO usuario (id, nome, senha) VALUES (?, ?, ?)',
      [
            ('luan', 'Luan Marques', 'flask'),
            ('nico', 'Nico', '7a1'),
            ('danilo', 'Danilo', 'vegas')
      ])

cursor.execute('SELECT * FROM usuario')
print(' -------------  Usuários:  -------------')
for linha in cursor.fetchall():
    print(linha[1])

# inserindo jogos
cursor.executemany(
      'INSERT INTO jogo (nome, categoria, console) VALUES (?, ?, ?)',
      [
            ('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'),
      ])

cursor.execute('SELECT * FROM jogo')
print(' -------------  Jogos:  -------------')
for linha in cursor.fetchall():
    print(linha[1])

# commitando senão nada tem efeito
conn.commit()
cursor.close()
input('\nAperte ENTER para continuar...')

dao_SQLite.py:

from models import Jogo, Usuario
import sqlite3

SQL_CRIA_JOGO = 'INSERT INTO jogo (nome, categoria, console) VALUES (?, ?, ?)'
SQL_ATUALIZA_JOGO = 'UPDATE jogo SET nome=?, categoria=?, console=? WHERE id = ?'
SQL_DELETA_JOGO = 'DELETE FROM jogo WHERE id = ?'
SQL_BUSCA_JOGOS = 'SELECT id, nome, categoria, console FROM jogo'
SQL_JOGO_POR_ID = 'SELECT id, nome, categoria, console FROM jogo WHERE id = ?'

SQL_USUARIO_POR_ID = 'SELECT id, nome, senha FROM usuario WHERE id = ?'

class JogoDao:
    def __init__(self, database):
        #não criei a conexão aqui pq o sqlite precisa usar a con. na mesma thread
        self.__database = database

    def salvar(self, jogo):
        with sqlite3.connect(self.__database) as conn:
            cursor = conn.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
            conn.commit()
        return jogo

    def listar(self):
        with sqlite3.connect(self.__database) as conn:
            cursor = conn.cursor()
            cursor.execute(SQL_BUSCA_JOGOS)
            jogos = traduz_jogos(cursor.fetchall())
        return jogos

    def busca_por_id(self, id):
        with sqlite3.connect(self.__database) as conn:
            cursor = conn.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):
        with sqlite3.connect(self.__database) as conn:
            cursor = conn.cursor()
            cursor.execute(SQL_DELETA_JOGO, (id, ))
            conn.commit()


class UsuarioDao:
    def __init__(self, database):
        self.__database = database

    def buscar_por_id(self, id):
        with sqlite3.connect(self.__database) as conn:
            cursor = conn.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])

início do jogoteca.py:

...
#from flask_mysqldb import MySQL
import sqlite3
...
app = Flask(__name__)
... #(onde ficaria as conf. do mysqldb do prof.)
database = 'jogoteca.db'
jogo_dao = JogoDao(database)
usuario_dao = UsuarioDao(database)
...