Подтвердить что ты не робот

Sqlite3, OperationalError: невозможно открыть файл базы данных

Вопрос: Почему я не могу открыть базу данных?


Информация: Я работаю над проектом, цель которого не важна, но использует базу данных sqlite3. Я сделал тестовую программу, которая запускает и передает ей местоположение для создания базы данных:

/tmp/cer/could.db

а программа unit test может сделать db без проблем. Затем я фактически использую программу, передавая ей одно и то же место, и он говорит

OperationalError: невозможно открыть файл базы данных

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

Любые подсказки о том, что происходит на Земле?

4b9b3361

Ответ 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, и удалите ее для более быстрого исправления.