[resolvido] Gerando clausulas WHERE IN dinamicamente. (Python/Sqlite3)

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:

  1. ID (integer);
  2. NOME (text);
  3. 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:

  1. [“?”]*len(procurar_ids): Isso vai gerar uma lista contendo uma interrogação para cada elemento. Neste caso, o resultado vai ser: [‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’, ‘?’]
  2. “, “.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.

The following two tabs change content below.
Arquiteto de Software e Desenvolvedor Backend (quase Fullstack), geralmente trabalho com C#, PowerShell, Python, Golang, bash e Unity (esse é mais por hobby). Estou sempre buscando algo novo para aprender, adicionando novas ferramentas ao meu cinto de utilidades.
Posted in Dev, Python and tagged , , , .