Oi Bruno, tudo bem?
Com o framework flask não temos cursos que abordem mais explicações entre a comunicação de um banco e Python.
Sobre as classes JogoDao e UsuarioDao, tentarei explicar com mais clareza como elas estão funcionando, começando pela JogoDao, que é responsável por fazer as consultas referentes ao jogo em nosso banco de dados:
- No método construtor, o init recebe como parâmetro uma instância do banco de dados, ou seja, quando instanciarmos um objeto da classe JogoDao temos que passar como parâmetro o nosso banco:
Método init
def __init__(self, db):
self.__db = db
Chamada da classe JogoDao
db = MySQL(app)
jogo_dao = JogoDao(db)
Observe que nesta chamada da classe JogoDao, o MySQL está recebendo como parâmetro as configurações do nosso banco de dados, bem como usuário, banco, senha... e elas são feitas por meio de uma estrutura de dicionário, onde as chaves(MYSQL_HOST, MYSQL_USER, MYSQL_PASSWORD....) são definidas com base na documentação.
app.config['MYSQL_HOST'] = "localhost"
app.config['MYSQL_USER'] = "root"
app.config['MYSQL_PASSWORD'] = "admin"
app.config['MYSQL_DB'] = "jogoteca"
app.config['MYSQL_PORT'] = 3306
Recapitulando o que é feito neste primeiro momento:
- Passamos as configurações do nosso banco para instância do MySQL
- Pegamos esta instância do MySQL que foi configurada e passamos para o nosso método inicializador na classe JogoDao, que por enquanto só guardará a instância que foi passada:
self.__db = db
Dando prosseguimento a classe JogoDao, iremos ter o método salvar:
def salvar(self, jogo):
cursor = self.__db.connection.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.connection.commit()
return jogo
Neste método, a linha: cursor = self.__db.connection.cursor()
é responsável por fazer a conexão com o banco, onde, este método irá nos retornar um objeto do nosso banco de dados. Então o que é acontece é o seguinte:
- Fizemos todas as configurações do banco
- Passamos para a instância do MySQL
- Passamos esta instância do MySQL para a nossa classe JogoDao e a classe guardou esta instância(no método init)
Só que agora, queremos utilizar esta instância do nosso banco que estava guardada. E para ela ficar apta para uso, ou seja, nos permitir inserir, deletar, modificar... precisamos chamar o método : connection.cursor() para a variável que possui a instância do nosso banco, por isso de: self.__db.connection.cursor()
.
Daí, logo abaixo temos um if que verifica se o jogo possui id. Essa verificação é pelo fato de que se o jogo já possuir um id quer dizer que ele já foi criado. Certo?! Então o que queremos fazer é atualizar este jogo:
if (jogo.id):
cursor.execute(SQL_ATUALIZA_JOGO, (jogo.nome, jogo.categoria, jogo.console, jogo.id))
O método execute é responsável por executar um SQL. Ele recebe como primeiro parâmetro a SQL e como segundo parâmetro uma tupla com as variáveis que queremos mandar para o nosso banco.
Caso o jogo não tenha um id, quer dizer que ele ainda não foi criado, então entraremos na condição de else:
else:
cursor.execute(SQL_CRIA_JOGO, (jogo.nome, jogo.categoria, jogo.console))
jogo.id = cursor.lastrowid
Temos aqui a mesma estrutura de um execute que foi explicado acima. E por fim, na linha: jogo.id = cursor.lastrowid
, o método lastrowid é responsável por nos retornar o id do último jogo inserido no banco.
Lembrando que o id é inserido no banco de forma automática, pois, na criação da tabela declaramos que ele será um autoincrement:
`id` int(11) NOT NULL AUTO_INCREMENT,
Você deve estar se perguntando: porque é importante retornar o último id? Neste caso, a utilidade dele é porque quando vamos atualizar algum jogo temos que passar também o id deste jogo.
No fim do método de criar, temos:
self.__db.connection.commit()
return jogo
Quando fazemos connection.commit() é para que as informações sejam de fato realizadas no banco, esse método é essencial, sem ele, as informações não seriam inseridas. E por último, retornamos o jogo, pois lembra que jogo.id
foi alterado? É por isso que retornamos o jogo.
Ficou claro esta parte? Fique a vontade para questionar se houver ficado alguma dúvida até aqui.