2

Существует сценарий 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 будет считываться построчно, и я мог бы применить "магию" к ссылочным файлам, но я не могу обновить строку в базе данных - я получил ошибку:

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

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

2 ответа2

2

если вы не хотите переходить на реальную базу данных SQL, и временное сохранение результата невозможно, вам следует убедиться, что вы не запускаете одновременные SELECT и UPDATE для одной и той же таблицы.

см. директиву LIMIT для SELECT.

так что вы бы сделали что-то вроде:

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

Это привело бы к тому, что SELECT всегда возвращал только один результат и заканчивал, который вы затем обрабатывали бы и ОБНОВЛЯЛИ, и перезапускали SELECT, чтобы получить следующий результат (при изменении STATUS SELECT получит следующее значение, а не старое, поскольку оно больше не соответствует "N"). )

или, может быть, вы могли бы сделать "некоторое волшебство (тм)" через SQL вместо оболочки, чтобы вы могли переложить всю работу на движок SQL ...

1

Вы должны действовать в два этапа. Либо сохраните результат первого запроса во временный файл (или переменную), а затем обработайте его; или, накапливать операторы обновления во временном файле или переменной и выполнять после завершения выбора.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .