3
respostas

Erro ao executar prepara_banco.py - Commands out of sync

Bom dia, pessoal!

Estou segundo os passos para fazer a conexão com o db, mas tive um problema ao tentar executar o prepara_banco.py:

Conectando...
Traceback (most recent call last):
  File "prepara_banco.py", line 26, in <module>
    conn.cursor().execute(criar_tabelas)
  File "/Users/leilahnogueira/Documents/Alura/Flask/jogoteca/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 253, in execute
    self._warning_check()
  File "/Users/leilahnogueira/Documents/Alura/Flask/jogoteca/venv/lib/python3.6/site-packages/MySQLdb/cursors.py", line 148, in _warning_check
    warnings = db.show_warnings()
  File "/Users/leilahnogueira/Documents/Alura/Flask/jogoteca/venv/lib/python3.6/site-packages/MySQLdb/connections.py", line 381, in show_warnings
    self.query("SHOW WARNINGS")
  File "/Users/leilahnogueira/Documents/Alura/Flask/jogoteca/venv/lib/python3.6/site-packages/MySQLdb/connections.py", line 277, in query
    _mysql.connection.query(self, query)
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

Baixei o arquivo como foi disponibilizado nos exercícios, e só mexi na senha do root, o resto continua igual:

import MySQLdb
print('Conectando...')
conn = MySQLdb.connect(user='root', passwd='admin', host='127.0.0.1', port=3306)

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

criar_tabelas = '''SET NAMES utf8;
    CREATE DATABASE `jogoteca` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
    USE `jogoteca`;
    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;
    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)

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

Alguém consegue me ajudar? Tentei procurar no google, mas não consegui resolver o problema :/

3 respostas

Oi Leilah, boa tarde! Eu rodei exatamente o código que você postou aqui e deu tudo certo. Pode ser algo externo ou problemas de versão. Qual a versão do MySQL e Python que você está utilizando?

Outra coisa, pesquisei aqui e vi que este código de erro do MySQL (2014) é comum acontecer quando fazemos composição de query. Faça os seguintes testes para ver se dá certo:

1 - chamar esta função conn.store_result() após a execução da query:

    conn.cursor().execute(criar_tabelas)
    conn.store_result(criar_tabelas)

ou

2 - separar as queries e executar uma de cada vez:

criar_tabela_jogo = '''SET NAMES utf8;
    CREATE DATABASE `jogoteca` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */;
    USE `jogoteca`;
    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;'''

criar_tabela_usuario = '''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_tabela_jogo)
conn.cursor().execute(criar_tabela_usuario)

veja se alguma destas sugestões dá certo e dá um feedback aqui.

Oi, Thais, bom dia! A versão do MySQL é a 8.0.11, e a do Python é 3.6.5. Tentei os dois comandos sugeridos, e continuou dando o mesmo erro. O engraçado é que entrei no MySQL Workbench e o jogoteca aparece na lista de schemas (mas não no Connections). Inclusive, quando tentei criar o banco por query lá, disse que o database já existia... Como ainda não fiz o curso de MySQL, confesso que sou totalmente leiga nesse assunto.

Certo, tente mudar o nome da base de dados. Mude, por exemplo, de jogotecapara jogoteca1 (em todo seu código) e tente novamente. E execute este código

    conn.commit()

após executar a criação das tabelas:

conn.cursor().execute(criar_tabelas)
conn.commit()

Se não der certo, abra e feche o cursor a cada ação no banco:

cursor = connection.cursor() 
cursor.close()