3
respostas

Erro ao inserir os dados no banco

Estou usando o código que foi entregue no exercício:

import MySQLdb
print('Conectando...')
conn = MySQLdb.connect(user='root', passwd='########', 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', 'Estrategia', '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()

Ao rodar o banco está sendo criado normalmente porem não consegue inserir os dados e me retorna o seguinte erro:

Conectando... ------------- Usuários: ------------- Traceback (most recent call last): Danilo File "C:/Users/Asus/PycharmProjects/jogoteca/prepara_banco.py", line 52, in Luan Marques ('Fire Emblem Echoes', 'Estrategia', '3DS'), Nico File "C:\Users\Asus\PycharmProjects\jogoteca\venv\lib\site-packages\MySQLdb\cursors.py", line 234, in executemany self.getdb().encoding) File "C:\Users\Asus\PycharmProjects\jogoteca\venv\lib\site-packages\MySQLdb\cursors.py", line 261, in doexecute_many rows += self.execute(sql + postfix) File "C:\Users\Asus\PycharmProjects\jogoteca\venv\lib\site-packages\MySQLdb\cursors.py", line 206, in execute res = self.query(query) File "C:\Users\Asus\PycharmProjects\jogoteca\venv\lib\site-packages\MySQLdb\cursors.py", line 312, in _query db.query(q) File "C:\Users\Asus\PycharmProjects\jogoteca\venv\lib\site-packages\MySQLdb\connections.py", line 224, in query _mysql.connection.query(self, query) MySQLdb.exceptions.OperationalError: (1366, "Incorrect string value: '\xE7\xE3o' for column 'categoria' at row 1")

como posso resolver?

3 respostas

o Script criou o banco, mas não conseguiu inserir os valores, inseri manualmente via banco e funcionou perfeitamente

INSERT INTO jogoteca.usuario (id, nome, senha) VALUES ('luan', 'Luan Marques', 'flask');
INSERT INTO jogoteca.jogo (nome, categoria, console) VALUES  ('Fire Emblem Echoes', 'Estrategia', '3DS')

O problema está nessa linha:

('God of War 4', 'Ação', 'PS4'),

não esta aceitando inserir o caracter Ç e o Ã

vou colocar sem os acentos para continuar com o curso, mas como resolvo isso?

Olá Rafael, boa tarde!

Essa dúvida já apareceu no fórum uma vez e está nesta thread: https://cursos.alura.com.br/forum/topico-erro-ao-executar-prepara_banco-py-incorrect-string-value-xe7-xe3o-for-column-categoria-52239 .

A solução é você modificar o enconding no banco de utf-8 para latin1 como apresentada no link que te enviei:

criar_tabelas = '''SET NAMES latin1;
 # resto do código....

Veja se resolve seu problema.

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software