Резервное копирование базы данных sqlite3 - PullRequest
1 голос
/ 05 мая 2020

У меня есть проект Python, в котором я использую sqlite3 для сохранения данных.

Я хочу сделать резервную копию базы данных (я действительно беспокоюсь о блокировке данных, потому что мое программное обеспечение будет использоваться примерно 10 людьми, которым потребуется доступ к моей базе данных для записи или чтения, и без везения, кто-то попытается получить доступ к базе данных в неподходящий момент, даже если я увеличу тайм-аут)

Если я сделаю это вручную с помощью Windows cmd, проблем не возникнет.

v:
cd V:\directory\
sqlite3 mydatabase.db"
.backup backup_db.db

Я пытаюсь создать командный файл, который будет вызываться каждый час моей программой python, чтобы делать это автоматически. Я применил в нем те же команды.

Пакетный файл запускается, но процесс останавливается после открытия базы данных. Команда точки не выполняется.

где моя ошибка?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Пакетные файлы работают не так, как вы думаете.

В настоящее время вы думаете, что после строки sqlite3 "mydatabase.db" вы находитесь в каком-то «режиме базы данных» и всех следующих строк в командном файле передаются процессу sqlite3.

Это не так.

Каждая строка в пакетном файле выполняется после завершения предыдущего подобного.

Строка sqlite3 "mydatabase.db" запускает процесс sqlite3 ... а затем ожидает завершения этого процесса. Этого никогда не произойдет, если вы не сделаете это вручную, нажав клавишу.

И после этого cmd.exe попытается выполнить команду .backup backup_db.db, но поскольку это не команда cmd.exe понимает, произойдет сбой с ошибкой ( ". backup 'не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл." ).

Что вы действительно хотите do - это создать файл сценария и передать его SQLite для обработки. Это можно сделать,

  • перенаправив файл в процесс sqlite3. Предположим, что create_backup.txt содержит команды для создания резервной копии:

    sqlite3 "mydatabase.db" < create_backup.txt
    
  • передача файла в процесс sqlite3, например, используя type:

    type create_backup.txt | sqlite3 "mydatabase.db"
    

    в качестве альтернативы вы можете использовать echo для вывода команды:

    echo .backup backup_db.db | sqlite3 "mydatabase.db"
    

Очевидно, что метод echo проще для однострочников, тогда как перенаправление ввода с помощью < или записи Из файла с type проще выполнять более сложные многострочные операции.

Другой вариант, который вы можете попробовать - использовать параметр -init в sqlite3.exe. См. Документацию по SQLite.

0 голосов
/ 05 мая 2020

Синтаксис исполняемого файла sqlite3: sqlite3 [db_file] [command]. Итак, в вашем пакетном файле вы должны включить .backup в той же строке.

v:
cd V:\directory\
sqlite3 mydatabase.db ".backup backup_db.db"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...