Sqlite3, OperationalError: невозможно открыть файл базы данных - PullRequest
48 голосов
/ 09 января 2011

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


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

/tmp/cer/could.db

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

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

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

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

Ответы [ 12 ]

59 голосов
/ 09 января 2011

Первичная диагностика: SQLite по какой-то причине не может открыть этот файл.

Проверка очевидных причин, почему и в приблизительном порядке я рекомендую проверить:

  • Программа работает на той же машине, на которой вы ее тестируете?
  • Он работает как вы (или хотя бы тот же пользователь, с которым вы его тестируете)?
  • Заполнен ли диск, содержащий /tmp? (Вы работаете в Unix, поэтому используйте df /tmp, чтобы узнать.)
  • Имеет ли каталог /tmp/cer «нечетные» разрешения? (SQLite должен иметь возможность создавать в нем дополнительные файлы для обработки таких вещей, как журнал фиксации.)
  • Код модульного теста все еще использует эту базу данных? (Одновременные открытия возможны с достаточно современным SQLite и в правильной файловой системе - хотя /tmp практически всегда находится в правильном виде FS, так что, вероятно, это не так - но это все еще не рекомендуется.)
  • Код разработки действительно пытается записать в эту базу данных, или что-то «умное» ловит вас и заставляет пытаться открыть что-то еще? (Я был пойман этим в моем коде в прошлом; не думаю, что это не может случиться с вами ...)
  • Используете ли вы ту же версию библиотеки SQLite в модульных тестах и ​​в рабочем коде?

Если вы не на том же компьютере, вполне возможно, что в производственной системе нет каталога /tmp/cer. Очевидно, чтобы исправить это в первую очередь. Точно так же, если вы находитесь на одной машине, но работаете от имени разных пользователей, у вас, скорее всего, будут проблемы с правами доступа / владельцем. Дисковое пространство - еще одна серьезная проблема, но менее вероятная. Я не думаю, что это последние три, но стоит проверить, решены ли более очевидные проблемы развертывания. Если ничего из вышеперечисленного не возникло, вы столкнулись с экзотической проблемой и должны будете сообщить гораздо больше информации (это может быть даже ошибка в SQLite, но, зная ее разработчиков, я считаю, что это маловероятно).

26 голосов
/ 26 декабря 2011

Это сработало для меня:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")

Примечание: двойная косая черта в полном пути

Использование python v2.7 на Win 7 enterprise и Win Xp Pro

Надеюсь, это кому-нибудь поможет.

6 голосов
/ 11 июля 2017

В Unix я получил эту ошибку при использовании ярлыка ~ для пользовательского каталога.Изменение на /home/user устраняет ошибку.

2 голосов
/ 02 апреля 2017

Одной из причин может быть запуск кода по пути, который не совпадает с указанным вами путем для базы данных.Например, если в вашем коде есть:

conn = lite.connect('folder_A/my_database.db')

И вы запускаете код внутри folder_A или в других местах, где нет folder_A, это вызовет такую ​​ошибку.Причина в том, что SQLite создаст файл базы данных, если он не существует, а не в папке.

Еще один способ обойти эту проблему - заключить команду подключения в выражение try-except и создать каталог.если он повышает sqlite3.OperationalError.

из операционной системы os import mkdir import 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')
1 голос
/ 14 декабря 2013

Я столкнулся с той же проблемой в Windows 7. Имя моей базы данных было test, и я получил ошибку:

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

Я заменил test на test.db и все прошло гладко.

1 голос
/ 24 ноября 2011

Убедитесь, что вы не редактируете файл settings.py при попытке запустить syncdb, вы получите ту же ошибку !!!

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file
0 голосов
/ 15 марта 2019

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) Убедитесь в разрешении и праве собственности на папку назначения

у меня сработало,

0 голосов
/ 29 ноября 2018

Использовать полностью классифицированное имя файла базы данных

Использование- /home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite

instead-

0 голосов
/ 03 октября 2018

Это определенно проблема с разрешениями. Если кто-то получает эту ошибку в Linux, убедитесь, что вы запускаете команду с sudo, поскольку файл, скорее всего, принадлежит пользователю root. Надеюсь, это поможет!

0 голосов
/ 25 июня 2018
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)


для более ясного полного пути, если вы не поняли его полностью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...