[resolvido] Gerando clausulas WHERE IN dinamicamente. (Python/Sqlite3)
Overview
Neste post, vamos desvendar o método simples e eficaz para trabalhar com argumentos dinâmicos em uma cláusula WHERE IN no SQLITE. Com um exemplo prático que envolve a seleção de registros de uma tabela por uma lista variável de IDs, demonstraremos como montar e executar sua query de maneira eficiente. Ideal para programadores de todos os níveis, este guia promete agregar valor tanto para pequenas quanto para grandes manipulações de dados. Vamos juntos desbravar essa jornada rumo à flexibilidade no manuseio de databases!
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.