Обновите базу данных sqlite при выборе цикла while

5992
UsersUser

Существует сценарий bash, который будет «творить магию» с файлами, которые будут ссылаться на базу данных sqlite, и после «магии» ™ база данных должна быть обновлена. Вот упрощенный код

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 

Все работает, база данных sqlite будет считываться построчно, и я мог бы применить «магию» к ссылочным файлам, но я не могу обновить строку в базе данных - я получил ошибку:

Ошибка: база данных заблокирована

Кто-нибудь знает, как я могу обновить базу данных при чтении базы данных? Или есть другое решение, как я мог это сделать?

1

2 ответа на вопрос

2
Matija Nalis

if you don't want to move to a real SQL database, and temporarily storing the result is not possible, you'll have to make sure you don't run concurrent SELECT and UPDATE on the same table.

see LIMIT directive for SELECT.

so you'd do something like:

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 

That would make SELECT always return just one result and finish, which you would then process and UPDATE, and rerun SELECT to get next result (as STATUS changed, SELECT would get next value, not the old one as it no longer matches "N")

or maybe you could do "some magic (tm)" via SQL instead of a shell, so you could offload all the work to SQL engine...

Ты прав. В то же время я нашел другое решение с двумя SQL-запросами (одно для установки всех выборок в массиве bash, другое для задания переменных), но ваше решение проще и с меньшими ресурсами (я думаю) .a UsersUser 9 лет назад 0
1
choroba

You have to proceed in two steps. Either, store the result of the first query to a temp file (or variable) and then process it; or, accumulate the update statements in a temp file or variable and execute after the select is finished.

Ну, проблема в том, что это огромная база данных, поэтому я не могу сохранить результат в виде файла или переменной, чтобы перехватить все результаты. И я не могу разделить его на два шага, потому что мне нужен цикл, который будет перехватывать все результаты (или я не знал, что смогу перехватить все строки базы данных). UsersUser 9 лет назад 0
@UsersUser: тогда используйте реальную базу данных. choroba 9 лет назад 0
Да, реальная база данных будет проще с большим количеством опций, но для этого также потребуется установка сервера базы данных, который мне не нужен на моем настольном компьютере. UsersUser 9 лет назад 0

Похожие вопросы