Situação: Você tem uma query que possui uma cláusula WHERE IN e precisa utilizar argumentos dinámicos no momento de executa-la.
A solução é bem simples.
Para este exemplo, imagine uma tabela com as seguintes colunas:
- ID (integer);
- NOME (text);
- EMAIL (text);
O que você quer é selecionar todos os registros onde o ID esteja entre uma lista de valores. O tamanho desta lista pode variar um (o que não é exatamente uma lista grande) até o infinito.
# IDs que serão procurados no banco procurar_ids = [1,2,3,4,5,6,7,8,9,10,42]
No código acima, temos uma lista com os IDs que queremos buscar.
Agora vamos definir a query base:
query = "select id, nome, email from tb_usuarios where id in ({})"
Então agora temos uma query base com um placeholder no lugar dos IDs. Como o SQLITE3 já faz o parse (processamento) dos argumentos que vamos enviar, não precisamos fazer isso manualmente. Podemos apenas incluir uma interrogação para cada um dos elementos da lista.
where_in_clause = ", ".join(["?"]*len(procurar_ids))
No código acima estamos fazendo duas coisas:
- [“?”]*len(procurar_ids): Isso vai gerar uma lista contendo uma interrogação para cada elemento. Neste caso, o resultado vai ser: [‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’]
- “, “.join(…): Este método da string vai transformar a lista em uma string onde os valores estarão separados por vírgulas.
Agora precisamos formatar a query base que criamos anteriormente com esta lista que geramos agora:
query = query.format(where_in_clause)
O próximo passo é executar a query, passando os valores como argumento para o SQLITE.
import sqlite3 db = sqlite3.connect(db_file) cursor = db.cursor() query_result = cursor.execute(query, procurar_ids) result = query_result.fetchall()
No método execute, passamos a query com as interrogações no lugar onde os valores vão entrar e a lista com os argumentos em si.
Após a execução da consulta, utilizei o método fetchall para recuperar todos os resultados obtidos na query.
É isso. Basta gerar a string com uma interrogação para cada elemento e você pode utilizar o método execute, passando os valores como argumento.
Espero ter ajudado.
Latest posts by Breno RdV (see all)
- O que é Metaclass e como ela funciona. (#python #dev #metaclass) - janeiro 11, 2023
- Entenda a mágica dos Generators. (#python, #dev, #generator, #iterator) - dezembro 28, 2022
- Ordenando um DataFrame por múltiplas colunas. (#python #pandas #jupyter #dev #data) - agosto 3, 2022