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

Problemas com import MySQLdb e Commands out of sync

Esse tópico tem como função tentar ajudar as próximas pessoas com os problemas que tive com ambos os erros citados no título. O sistema utilizado foi o Fedora 29, logo dependendo da Distro/SO utilizado pode haver diferenças:

Obs: utilizado Python 3.7 e MySQL 8.0

Começando pelo problema de import do MySQLdb, este Python Package não suporta o uso de Python 3 logo se você tentar fazer o uso do comando PiP pode acontecer que, dependendo de como seu SO trabalha, instalar a versão usada no Python2 (mais especificamente 2.7) então quando for fazer a instalação do pacote utilizar o comando:

pip3 install mysqlclient

com isso ele fara a instalação do pacote mysqlclient que é um fork do MySQLdb1 que suporta a versão 3.X do Python. Nota: O mysqlclient tem dependências/pré-requisitos necessários para rodar:

sudo apt-get install python3-dev default-libmysqlclient-dev # Debian / Ubuntu
sudo yum/dnf install python3-devel mysql-devel # Red Hat / CentOS
brew install mysql-connector-c # macOS (Homebrew)

Agora a segunda parte sobre Commands out of sync:

Segundo a própria documentação do MySQL, o erro é causado por estar executando essas queries na ordem errada ou por tentar fazer o uso de múltiplas queries, contudo ela mesmo faz a ressalva que se fizer o uso do mysql_store_result() pode ser a solução para o problema.

Aprofundando um pouco para tentar encontrar uma solução na documentação do mysqlclient Package encontrei que a Classe Cursor() faz o uso do mysql_store_result() contudo não de uma maneira que possa ser uma solução para o script utilizado na aula (acredito que possa haver um bug em si em como o store_result() é trabalhado dentro da classe). Então finalizando, parece que a melhor maneira para corrigir isso é dividindo as queries na variável criar_tabelas como proposto pelo Daniel Corrêa Lobato neste tópico:

O Script completo segue abaixo:

import MySQLdb
print('Conectando...')
conn = MySQLdb.connect(user='root', passwd='senha do seu usúario root aqui (do seu MySQL)', host='127.0.0.1', port=3306)

# Descomente se quiser desfazer o banco, se executado mais de uma vez ira resetar o banco de dados
conn.cursor().execute("SET NAMES utf8;")
conn.cursor().execute("DROP DATABASE `jogoteca`;")
conn.commit()
conn.cursor().execute("CREATE DATABASE `jogoteca`;")
conn.commit()

conn.cursor().execute("USE `jogoteca`;")
criar_tabelas = '''CREATE TABLE `jogo` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nome` varchar(50) COLLATE utf8_bin NOT NULL,
      `categoria` varchar(40) COLLATE utf8_bin NOT NULL,
      `console` varchar(20) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;'''
conn.cursor().execute(criar_tabelas)
conn.commit()

criar_tabelas = '''CREATE TABLE `usuario` (
      `id` varchar(8) COLLATE utf8_bin NOT NULL,
      `nome` varchar(20) COLLATE utf8_bin NOT NULL,
      `senha` varchar(8) COLLATE utf8_bin NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;'''
conn.cursor().execute(criar_tabelas)
conn.commit()

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

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

# inserindo jogos
cursor.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'),
      ])

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

# commitando senão nada tem efeito
conn.commit()
cursor.close()

Espero que todo este Textão rs possa lhe ajudar, se me equivoquei em algo por favor, complemente =D

Atenciosamente,

2 respostas
solução!

Show de bola, Victor Hugo!

Vou até pegar o link desta resposta pra passar pra quem tiver problemas parecidos.

Ficou super completo!

Opa vlws Luan, vou marcar sua resposta como resolvido então. Realmente o curso seu de flask é nota 10 =P