Atualiza um banco de dados sqlite enquanto seleciona em um loop while

1

Existe um script bash que fará "um pouco de magia" ™ para arquivos que serão referenciados a um banco de dados sqlite e depois de fazer "alguma mágica" ™ o banco de dados deve ser atualizado. Aqui está o código simplificado

sqlite3 database.db "select NUMBER from table WHERE STATUS = 'N'" | while read line; do
    SELECTION=$(echo $line | awk -F'|' '{ print $1 }')
    [some magic]™
    sqlite3 database.db "update table SET STATUS='Y' WHERE NUMBER='$SELECTION'"
done

Tudo funciona, o banco de dados sqlite será lido linha por linha e eu poderia fazer "um pouco de mágica" ™ nos arquivos referenciados, mas não consigo atualizar a linha no banco de dados - recebi um erro:

Error: database is locked

Alguém sabe como eu poderia atualizar um banco de dados durante a leitura de um banco de dados? Ou há outra solução como eu poderia fazer isso?

    
por UsersUser 23.10.2014 / 15:08

2 respostas

2

Se você não quiser mover para um banco de dados SQL real, e armazenar temporariamente o resultado não for possível, você terá que certificar-se de não executar SELECT e UPDATE simultâneos na mesma tabela.

Veja a diretiva LIMIT para SELECT.

então você faria algo como:

line=x
while [ -n "$line" ]
do
    line=$(sqlite3 database.db "select NUMBER from table WHERE STATUS = 'N'" LIMIT 1)
    SELECTION=$(echo $line | awk -F'|' '{ print $1 }')
    [some magic]™
    sqlite3 database.db "update table SET STATUS='Y' WHERE NUMBER='$SELECTION'"
done

Isso faria com que o SELECT sempre retornasse apenas um resultado e finalizasse, o qual você processaria e UPDATE, e executaria novamente o SELECT para obter o próximo resultado (como STATUS alterado, SELECT receberia o próximo valor, não o antigo, pois não corresponderia mais "N")

ou talvez você pudesse fazer "alguma mágica (tm)" via SQL ao invés de um shell, então você poderia descarregar todo o trabalho no mecanismo SQL ...

    
por 25.10.2014 / 01:54
1

Você precisa prosseguir em duas etapas. Armazene o resultado da primeira consulta em um arquivo temporário (ou variável) e, em seguida, processe-o; ou, acumule as instruções de atualização em um arquivo temporário ou variável e execute após a conclusão da seleção.

    
por 23.10.2014 / 15:15