#Что означает ошибка
sqlite3.OperationalError: unable to open database file
Ошибка SQLite «unable to open database file» (код 14, SQLITE_CANTOPEN) возникает, когда файл или каталог недоступен: неверный путь, нет прав, каталог не существует, путь слишком длинный, либо нет места. Для записи SQLite требует права на сам файл и на каталог (для журнала).
Определите точный путь, который использует приложение.
Затем проверьте права.
SQLite не может открыть файл базы: путь неверный, нет каталога, нет прав на запись в каталог (нужно для временных файлов) либо диск только для чтения.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Указан неверный путь | В журнале относительный data/app.db, а рабочий каталог отличается от ожидаемого. | Сверить абсолютный путь и каталог запуска службы. |
| Не существует каталог или файл | Проверка Test-Path/ls не находит каталог или существующую рабочую базу. | Уточнить верное расположение; не создавать пустую базу автоматически. |
| Недостаточно прав процесса | Файл есть, но у учётной записи службы нет чтения, записи или доступа к каталогу. | Настроить минимальные права только для конкретной учётной записи. |
| Переполненный диск или проблемная ФС | df -h/df -i показывают отсутствие места или ошибки работы с томом. | Освободить место безопасно и проверить хранилище, не удаляя SQLite WAL. |
#Пошаговое решение
- Определите абсолютный путьСначала определите, какой файл SQLite пытается открыть приложение. В настройках или сообщении ошибки найдите путь к
.db/.sqliteи рабочий каталог процесса: относительный путь, напримерdata/app.db, зависит от того, откуда запущена программа. В Python проверьтеPath('data/app.db').resolve(); в PHP —realpath()для существующего файла или абсолютный путь, выстроенный от__DIR__. Не создавайте новую пустую базу только потому, что файл не найден: многие SQLite-библиотеки создают её автоматически, скрывая неверный путь. - Проверьте существование каталогаНа сервере или компьютере от имени пользователя приложения найдите указанный каталог и проверьте его существование: Linux —
ls -ld /абсолютный/путь/каталог, Windows — через Проводник либоTest-Pathв PowerShell. Если каталог не существует, выясните правильное местоположение файла по конфигурации и резервным копиям. Создавайте каталог только если приложение действительно должно создавать там новую базу; не копируйте случайный файл с похожим именем и не запускайте миграции, пока не определили нужную базу. - Проверьте права на файл и каталогЕсли путь правильный, проверьте права на файл, каталог и родительские каталоги для конкретной учётной записи службы. В Linux выполните
namei -l /путь/к/app.dbиls -l /путь/к/app.db, затем узнайте пользователя процесса (ps -eo user,pid,cmdс фильтрацией по имени службы); в Windows откройте свойства файла → «Безопасность». Для записи SQLite требуется доступ на запись не только к файлу, но и к каталогу для создания журналов/WAL. Не выполняйтеchmod 777или рекурсивную смену владельца всей папки сайта. - Проверьте место и блокировкиНа файловой системе проверьте место: Linux —
df -h /путь/к/каталогуиdf -i /путь/к/каталогу; Windows — «Этот компьютер» → свойства диска. Если файл размещён на сетевой или облачно синхронизируемой папке, учтите особенности блокировок SQLite, особенно в режиме WAL: предпочтительно держать рабочую базу на надёжном локальном диске. Не удаляйте файлы-walи-shmпри работающем приложении: это может повредить незавершённые транзакции. При признаках повреждения сначала делайте согласованную копию. - Откройте файл от имени того же пользователяПроверяйте подключение от той же учётной записи, под которой запущено приложение, и к полному пути, а не под root: на Linux администратор может использовать
sudo -u ИМЯ_СЛУЖБЫ sqlite3 /путь/к/app.db 'PRAGMA quick_check;'на существующей базе при наличии sqlite3. Выводokподтверждает лишь успешную проверку целостности на чтение, не право выполнить запись. Если приложение открывает файл, но пишетattempt to write a readonly database, переходите к проверке разрешений на запись; еслиdatabase is locked, сначала ищите конкурирующий процесс.
#Путь
Выведите абсолютный путь: убедитесь, что каталог существует (ls -ld /path). Относительные пути ломаются, когда изменяется рабочая папка. На Windows экранируйте обратные слеши. В URI-форме file: пробелы и спецсимволы кодируются. Проверьте, что имя файла не содержит недопустимых символов.
#Права
Linux: ls -l data.db и ls -ld каталог. Веб-сервер (www-data, nginx) должен иметь запись: sudo chown www-data:www-data data.db . и chmod 664 data.db, chmod 775 каталог. SELinux: ls -Z, restorecon. Docker: проверьте владельца тома. Windows: вкладка «Безопасность» в свойствах.
#Прочее
Проверьте свободное место (df -h) и квоты. Файл не должен быть заблокирован другим процессом (антивирус, резервное копирование). Не используйте сетевые файловые системы без поддержки блокировок. Если используется PHP open_basedir, он может запрещать путь. Проверьте журнал приложения и выполните sqlite3 путь напрямую от имени того же пользователя: sudo -u www-data sqlite3 /path/data.db ".tables".
# Пример диагностических команд Linux: точные пути и пользователь зависят от установки.ls -ld /var/www/appls -l /var/www/app/data.dbnamei -l /var/www/app/data.dbdf -h /var/www/app