[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.

No código acima, temos uma lista com os IDs que queremos buscar.

 

Agora vamos definir a query base:

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.

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:

 

O próximo passo é executar a query, passando os valores como argumento para o SQLITE.

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.
Breno RdV
Ex-Psicólogo, com quase uma década de experiência em Recursos Humanos e Gestão de Pessoas, atual desenvolvedor e Analista de Sistemas, trabalhando com PowerBuilder, C#, PowerShell e expandindo horizontes para Python, Xamarin, PHP, Angular e (por que não?) Unity.
Breno RdV

Latest posts by Breno RdV (see all)

Comments

comments

Posted in Dev, Python and tagged , , , .