Para cada padrão, você está invocando uma nova instância do programa sqlite
, que se conecta ao banco de dados novamente. Isso é um desperdício. Você deve criar uma única consulta que procure por qualquer uma das chaves e, em seguida, executar essa consulta. Os clientes de banco de dados são bons em executar consultas grandes.
Se as linhas correspondentes no arquivo keys
contiverem apenas dígitos, você poderá criar a consulta da seguinte forma:
{
echo 'select id from main where id in (';
<keys grep -x '[0-9][0-9]*' | # retain only lines containing only digits
sed -e '1! s/^/, /' | # add ", " at the beginning of every line except the first
echo ');'
} | sqlite3 db.sqlite
Para obter dados de entrada mais gerais, você tem a ideia: usar transformações de texto para criar uma única consulta grande. Tenha cuidado para validar sua entrada ; aqui nos certificamos de que o que é injetado na consulta é sintaticamente válido. Na verdade, há um caso de canto no exemplo acima: se não houver correspondência no arquivo, a sintaxe SQL será inválida; Se isso acontecer, você precisará tratar este caso especialmente. Aqui está um código mais complexo que cuida do caso vazio:
<keys grep -x '[0-9][0-9]*' |
if read first; then {
echo 'select id from main where id in (' "$first"
sed -e 's/^/, /'
echo ');'
} | sqlite3 db.sqlite
fi