Sqlite3, OperationalError: невозможно открыть файл базы данных
Вопрос: Почему я не могу открыть базу данных?
Информация: Я работаю над проектом, цель которого не важна, но использует базу данных sqlite3. Я сделал тестовую программу, которая запускает и передает ей местоположение для создания базы данных:
/tmp/cer/could.db
а программа unit test может сделать db без проблем. Затем я фактически использую программу, передавая ей одно и то же место, и он говорит
OperationalError: невозможно открыть файл базы данных
Я пытался сделать это с пустой базой данных. с базой данных unit test, оставленной позади, и без базы данных вообще. во всех трех случаях я получаю эту ошибку. Самая неприятная часть должна состоять в том, что unit test может сделать это просто отлично, но фактическая программа не может.
Любые подсказки о том, что происходит на Земле?
Ответы
Ответ 1
Первичный диагноз: SQLite не может открыть этот файл по какой-либо причине.
Проверка очевидных причин, почему и в примерном порядке, который я рекомендую проверить:
- Работает ли программа на том же компьютере, что и вы ее тестируете?
- Он работает как вы (или, по крайней мере, тот же пользователь, что и вы его тестируете)?
- Полный диск, содержащий
/tmp
? (Вы находитесь в Unix, поэтому используйте df /tmp
, чтобы узнать.)
- Имеет ли каталог
/tmp/cer
"нечетные" разрешения? (SQLite должен иметь возможность создавать в нем дополнительные файлы, чтобы обрабатывать такие вещи, как журнал фиксации.)
- Является ли код unit test все еще использующим эту базу данных? (Параллельные открытия возможны с помощью современного SQLite и в правильной файловой системе, хотя
/tmp
практически всегда находится в правильном порядке FS, поэтому он, вероятно, не тот, но он по-прежнему не рекомендуется.)
- Является ли код разработки действительно попыткой писать в эту базу данных или что-то "умное" ловит вас и заставляет его пытаться открыть что-то еще? (Я был пойман этим в моем коде в прошлом, не думаю, что это не может случиться с вами...)
- Используете ли вы ту же версию библиотеки SQLite в модульных тестах и производственный код?
Если вы не на одной машине, вполне возможно, что в производственной системе нет каталога /tmp/cer
. Очевидно, чтобы это исправить. Точно так же, если вы находитесь на одной машине, но работаете как разные пользователи, у вас могут возникнуть проблемы с правами/правами собственности. Дисковое пространство - еще одна серьезная проблема, но менее вероятно. Я не думаю, что это последние три, но стоит проверить, отсортированы ли более очевидные проблемы с развертыванием. Если это не так, вы столкнулись с экзотической проблемой и должны будете сообщить гораздо больше информации (это может быть даже ошибкой в SQLite, но, зная разработчиков, я считаю, что это маловероятно).
Ответ 2
Это сработало для меня:
conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")
Примечание. Двойные слэши в полном пути
Использование python v2.7 для Win 7 Enterprise и Win Xp Pro
Надеюсь, это поможет кому-то.
Ответ 3
В unix я получил эту ошибку при использовании ярлыка ~
для каталога пользователя.
Изменение его на /home/user
разрешило ошибку.
Ответ 4
Одной из причин может быть запуск кода в пути, который не соответствует указанному пути для базы данных. Например, если в вашем коде есть:
conn = lite.connect('folder_A/my_database.db')
И вы запустите код внутри folder_A
или других мест, у которых нет folder_A
, он вызовет такую ошибку. Причина в том, что SQLite создаст файл базы данных, если он не существует, а не в папке.
Другим способом обойти эту проблему может быть объединение вашей команды соединения в выражении try-except
и создание каталога, если оно вызывает sqlite3.OperationalError
.
from os import mkdir
импортировать sqlite3 как lite
try:
conn = lite.connect('folder_A/my_database.db')
except lite.OperationalError:
mkdir('folder_A')
finally:
conn = lite.connect('folder_A/my_database.db')
Ответ 5
Убедитесь, что вы не редактируете файл settings.py при попытке запустить syncdb, вы получите ту же ошибку!!!
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
Ответ 6
Я столкнулся с той же проблемой в Windows 7. Мое имя базы данных было test
, и я получил ошибку:
self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
Я заменил test
на test.db
, и все прошло гладко.
Ответ 7
1) Проверьте путь к вашей базе данных,
проверьте в вашем settings.py
DATABASES = {
'default': {
'CONN_MAX_AGE': 0,
'ENGINE': 'django.db.backends.sqlite3',
'HOST': 'localhost',
'NAME': os.path.join(BASE_DIR, 'project.db'),
'PASSWORD': '',
'PORT': '',
'USER':''
иногда не будет NAME ': os.path.join(BASE_DIR,' project.db '),
2) Убедитесь в разрешении и праве собственности на папку назначения
это сработало для меня,
Ответ 8
Единственное, что вам нужно сделать, это создать папку (так как она еще не существует), программа создаст только файл базы данных.
Это действительно сработало для меня!
Ответ 9
В моем случае решение было использовать абсолютный путь, чтобы найти существующий файл:
import os.path
filepath = os.path.abspath(filepath)
# Leave this out if the file does not exist yet
assert os.path.exists(filepath), "The file does not exist"
conn = sqlite3.connect(filepath)
Я не знаю, почему это исправление работает: путь содержал только символы ASCII и без пробелов. Тем не менее, это имело значение.
Для справки: Windows 7, Python 3.6.5 (64-разрядная версия).
Мне не удалось воспроизвести проблему на другом компьютере (также Windows 7, Python 3.6.4 64-bit), поэтому я понятия не имею, почему это исправление работает.
Ответ 10
import sqlite3
connection = sqlite3.connect("d:\\pythonAPI\\data.db")
cursor = connection.cursor()
create_table = "CREATE TABLE users (id int, username text, password text)"
cursor.execute(create_table)
для более ясного полного пути, если вы не поняли его
Ответ 11
Это определенно проблема с разрешениями. Если кто-то получает эту ошибку в Linux, убедитесь, что вы запускаете команду с sudo
, поскольку файл, скорее всего, принадлежит пользователю root. Надеюсь, это поможет!
Ответ 12
Используйте полностью классифицированное имя файла базы данных
Use-/home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite
instead-
Ответ 13
Если это происходит случайным образом после правильного доступа к вашей базе данных (и никакие настройки не изменились), это может быть результатом поврежденной базы данных.
Я получил эту ошибку после попытки записи в базу данных из двух процессов одновременно, и она, должно быть, повредила мой файл db.sqlite3.
Мое решение состояло в том, чтобы вернуться к предыдущей фиксации до того, как произошло повреждение.
Ответ 14
Моя причина была очень глупой.
Я поместил файл manage.py на терминал, чтобы он работал по полному пути.
И я изменил название папки проекта.
Поэтому теперь программе не удалось найти файл с предыдущими данными и, следовательно, с ошибкой.
Убедитесь, что вы перезапустите программное обеспечение в таких случаях.
Ответ 15
Запустил ошибку в Windows, добавил assert os.path.exists, дважды проверил путь, запустил скрипт от имени администратора, ничего не помогло.
Оказывается, если вы добавите свои папки в Защиту вымогателя Windows Defender, вы больше не сможете использовать для записи другие программы, если вы не добавите эти программы в белый список доступа к контролируемым папкам.
Решение - проверьте, была ли ваша папка добавлена в Защиту вымогателей Windows Defender, и удалите ее для более быстрого исправления.