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

Erro de sintaxe de SQL

Copiei o código "prepara_banco.py", comentei a primeira parte (estava retornando um erro, pois até então não havia o banco de dados 'jogoteca') e rodei, mas retornou esse erro:

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE DATABASE `jogoteca`;\n    USE `jogoteca`;\n    CREATE TABLE `jogo` (\n      ' at line 2")

O meu código "prepara_banco" está assim:

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

# Descomente se quiser desfazer o banco...

criar_tabelas = '''SET NAMES utf8;
    CREATE DATABASE `jogoteca`;
    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 sabe a razão da ocorrência deste erro?

Grato.

1 resposta
solução!

Solucionado.

O problema era: o 'execute' só executa um comando, e não é suportado o ponto-e-vírgula ao final deste. Então, fiz cada instrução ser um comando e realizei um 'for', o que deu certo:

criar_tabelas = [
    "SET NAMES utf8",
    "CREATE DATABASE jogoteca",
    "USE jogoteca",
    """CREATE TABLE jogo (
      id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      nome varchar(50) COLLATE utf8_bin NOT NULL,
      categoria varchar(40) COLLATE utf8_bin NOT NULL,
      console varchar(20) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    """,
    """CREATE TABLE usuario (
      id varchar(8) NOT NULL PRIMARY KEY COLLATE utf8_bin,
      nome varchar(20) COLLATE utf8_bin NOT NULL,
      senha varchar(8) COLLATE utf8_bin NOT NULL

    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
    """
]

cursor = conn.cursor()

for comando in criar_tabelas:
    cursor.execute(comando)