2
respostas

SQLAlchemy problema no cursor.executemany(operation, seq_params)

Boa tarde!

Estou montando um projeto em python com flask e banco de dados mysql conectado com sqlalchemy. Nesse projeto tenho uma das tabelas 'relacao_musculo' com o seguinte create:

TABLES['RelacaoMusculo'] = ('''
      CREATE TABLE `relacao_musculo` (
      `ID` int NOT NULL AUTO_INCREMENT,
      `REF_1` int NOT NULL,
      `REF_2` int DEFAULT NULL,
      `REF_3` int DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `REF_1` (`REF_1`),
      KEY `REF_2` (`REF_2`),
      KEY `REF_3` (`REF_3`),
      CONSTRAINT `relacao_musculo_ibfk_1` FOREIGN KEY (`REF_1`) REFERENCES `musculo` (`ID`),
      CONSTRAINT `relacao_musculo_ibfk_2` FOREIGN KEY (`REF_2`) REFERENCES `musculo` (`ID`),
      CONSTRAINT `relacao_musculo_ibfk_3` FOREIGN KEY (`REF_3`) REFERENCES `musculo` (`ID`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;''')

com a função cursor.executemany(operation, seq_params) estou tentando inserir na tabela alguns itens, conforme a sentença a seguir:


rel_musculos_sql = 'INSERT INTO relacao_musculo (REF_1) VALUES (%s)'
rel_musculos = [
      ('1'),
      ('2'),
      ('3'),
      ('4'),
      ('5'),
      ('6'),
      ('7'),
      ('8'),
      ('9'),
      ('10')
]
cursor.executemany(rel_musculos_sql, rel_musculos)

porém ao rodar o código ele não adiciona os itens e me devolve a seguinte resposta:


Traceback (most recent call last):
  File "C:\Users\Douglas\PycharmProjects\pythonProject\easyfit\venv\lib\site-packages\mysql\connector\cursor_cext.py", line 313, in _batch_insert
    prepared = self._cnx.prepare_for_mysql(params)
  File "C:\Users\Douglas\PycharmProjects\pythonProject\easyfit\venv\lib\site-packages\mysql\connector\connection_cext.py", line 686, in prepare_for_mysql
    raise errors.ProgrammingError(
mysql.connector.errors.ProgrammingError: Could not process parameters: str(1), it must be of type list, tuple or dict

não consegui entender pq ele processa o parâmetro como str(1) sendo que é uma lista de tuplas e só dentro da tupla contém o str para leitura do mysql, lembrando que apenas 2 campos da tabela são obrigatórios, o id pk autoincrement (não necessário especificar no insert) e a REF_1 especificada nas tuplas da lista de parâmetros.

Se alguém puder me ajudar eu agradeço!!

2 respostas

colocando vírgula dentro da tupla junto ao int transformou de fato em uma tupla e deu certo dessa vez.

Oi, Douglas, tudo bem?

Peço desculpas pela demora em te responder.

Ufa! Fico feliz em saber que descobriu o problema e conseguiu solucioná-lo. Às vezes pequenos detalhes, como uma vírgula, podem impedir que um código seja executado com êxito!

Caso surjam outras dúvidas durante os seus estudos, fico à disposição para ajudar.

Abraço.