Questão de Banco de Dados — MySQL — CESPE / CEBRASPE 2024
- Código
- ce403629
- Banca
- CESPE / CEBRASPE
- Órgão
- CNJ
- Ano
- 2024
- Cargo
- TJ
- CCerto
- EErrado
GabaritoC — Certo
Gabarito: Certo. A função cursor.execute() do conector MySQL para Python aceita, sim, uma string contendo uma consulta SQL — é exatamente o que o código do enunciado faz ao passar query = "INSERT INTO records (content) VALUES (%s)" como primeiro argumento. A afirmação é verdadeira e reflete o funcionamento padrão da API de banco de dados do Python (DB-API 2.0), que o mysql.connector implementa.
O cursor.execute() é o método responsável por enviar uma instrução SQL ao banco de dados. Ele recebe, no mínimo, dois argumentos: a string com o comando SQL e, opcionalmente, uma tupla ou dicionário com os parâmetros a serem substituídos nos placeholders (como o %s). No código apresentado, a string query contém um INSERT com um placeholder %s, e a tupla (line,) fornece o valor que será inserido — cada linha do arquivo data.txt vira um registro na tabela records.
É importante notar que o execute() não se limita a consultas de leitura (SELECT); ele executa qualquer comando SQL, incluindo INSERT, UPDATE, DELETE, CREATE TABLE, entre outros. A palavra "consulta" no enunciado pode dar a entender que se trata apenas de SELECT, mas no contexto de programação com bancos de dados, "consulta" é frequentemente usada de forma genérica para qualquer instrução SQL enviada ao SGBD. O que o método faz é compilar e executar a string SQL fornecida, retornando o resultado quando aplicável.
A pegadinha aqui é sutil: o candidato pode achar que cursor.execute() só executa SELECT ou que a string precisa ser de um tipo especial. Na verdade, o método aceita qualquer string SQL válida, e o uso de placeholders (%s) é justamente uma prática recomendada para evitar injeção de SQL, pois os valores são enviados separadamente e escapados pelo driver.
Outro ponto que merece destaque é o uso de connection.commit() dentro do loop. No MySQL, por padrão, o conector inicia uma transação implicitamente, e o commit() é necessário para persistir as alterações. Sem ele, as inserções seriam revertidas ao fechar a conexão. O código também trata erros com try/except e fecha cursor e conexão no bloco finally, o que é uma boa prática.
Guarde o critério decisivo: cursor.execute() aceita uma string SQL como primeiro argumento, independentemente de ser um SELECT, INSERT, UPDATE ou outro comando. É essa generalidade que torna a afirmação correta.
A afirmação "A função cursor.execute() é capaz de executar uma consulta SQL que tenha sido passada por uma string" está correta. O método execute() da classe Cursor do mysql.connector (e de qualquer driver que siga a DB-API 2.0 do Python) recebe uma string contendo a instrução SQL como primeiro parâmetro. No código do enunciado, isso fica evidente:
query = "INSERT INTO records (content) VALUES (%s)"
cursor.execute(query, (line,))A string query é passada diretamente ao execute(), que a envia ao MySQL para execução. O segundo argumento, (line,), é a tupla de parâmetros que substitui o placeholder %s de forma segura. Não há restrição de que a string seja de um tipo específico ou que o comando seja apenas de leitura — qualquer instrução SQL válida pode ser executada dessa forma.
O erro que o candidato poderia cometer é achar que execute() só funciona com SELECT ou que a string precisa ser formatada de outra maneira. Na prática, o método é genérico e aceita qualquer comando SQL, sendo o INSERT do exemplo uma prova disso. A afirmação está em conformidade com a documentação do mysql.connector e com o padrão DB-API 2.0 da linguagem Python.
Na prova, desconfie de afirmações que limitam a função de um método. cursor.execute() executa qualquer SQL — SELECT, INSERT, UPDATE, DELETE, CREATE — desde que a string seja válida. Memorize que o primeiro argumento é sempre a string SQL e o segundo, opcional, são os parâmetros. Essa generalidade é o que a banca testa aqui.
Gabarito: Certo
Link permanente: /questoes/ce403629