Назад | Перейти на главную страницу

Почему я получаю ошибку sqlite «не удается открыть файл базы данных»?

Используя мое приложение Django, я могу нормально читать из базы данных. Когда приложение не имело разрешения на доступ к файлу, оно выдавало мне эту ошибку:

попытка записи базы данных только для чтения

Что имело смысл. Итак, я отредактировал разрешения для файла, чтобы у процесса Apache были права на запись. Однако вместо того, чтобы писать, я получаю загадочную ошибку:

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

Если это полезно, вот полный вывод:

Request Method: POST
Request URL:    http://home-sv-1/hellodjango1/polls/1/vote/
Exception Type: OperationalError
Exception Value:    
unable to open database file
Exception Location: /usr/lib/pymodules/python2.5/django/db/backends/sqlite3/base.py in execute, line 193
Python Executable:  /usr/bin/python
Python Version: 2.5.2
Python Path:    ['/var/www', '/usr/lib/python2.5', '/usr/lib/python2.5/plat-linux2', '/usr/lib/python2.5/lib-tk', '/usr/lib/python2.5/lib-dynload', '/usr/local/lib/python2.5/site-packages', '/usr/lib/python2.5/site-packages', '/usr/lib/pymodules/python2.5', '/usr/lib/pymodules/python2.5/gtk-2.0']
Server time:    Sun, 23 Aug 2009 07:06:08 -0500

Сообщите мне, нужна ли трассировка стека.

Ага, только что наткнулся статья объясняя это. Также у Django есть информация об их НовичокОшибки страница.

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

В моем случае выполнение этой команды устранило проблему:

sudo chown www-data .

Мое решение было более похоже на это. Я действительно не хотел менять владельца этого каталога. (в основном потому, что я использую пользователя pi для таких вещей, как git)

/var/www/mysite $ ls -la sql*
-rw-rw-r-- 1 pi       pi       25600 Jan  2 22:57 sqlite.db

(или любой другой БД, который вы используете)

где пи - это пользователь, в котором я создал все файлы (да, это малиновый пи)

Вместо изменения разрешений на www-данные я обнаружил, что мне нужно только изменить разрешения следующим образом:

sudo chmod 775 /var/www/mysite
sudo chmod 664 /var/www/mysite/sqlite.db
sudo usermod -a -G pi www-data

Это дает группе доступ на запись к необходимым файлам и добавляет пользователя www-data в группу pi.

Примечание: если у вас есть ведение журнала, вам нужно будет сделать это и для файла журнала django, иначе apache это не очень понравится.

Из Django сообщает "Невозможно открыть файл базы данных" при использовании SQLite3 раздел из Ошибки новичка Django вики страница:

  1. убедитесь, что Apache также может писать в родительский каталог базы данных
  2. убедитесь, что ни одна из папок полного пути к файлу базы данных не начинается с числа
  3. убедитесь, что полный путь db каталог действительно существует
  4. убедитесь, что ваш /tmp каталог доступен для записи всем
  5. убедитесь, что путь к базе данных указан в settings.py это полный путь
  6. убедитесь, что в пути нет специальных символов
  7. в Windows убедитесь, что путь к каталогу db написан с двойными люфтами

Добавление рабочего пользователя в группу www-data хорошо работает в моей тестовой среде. Кроме того, я поместил файл sqlite3.db в отдельный подпапка, чтобы быть в большей безопасности.

Файл базы данных должен принадлежать www-data

sudo chown www-data mysite/db_sqlite3/
sudo chown www-data mysite/db_sqlite3/my.db

Мой оперативный пользователь, похоже, попал в группу www-data:

sudo usermod -a -G www-data hape

Разрешить доступ на запись к файлу базы данных членам группы www-data:

sudo chmod u+w+x,g+w+x mysite/db_sqlite3/
sudo chmod u+w+x,g+w+x mysite/db_sqlite3/my.db

В результате к базе данных можно получить доступ для чтения и записи с помощью apache2-daemon (пользовательские www-данные) без предоставления разрешения на корневую папку проекта, и, с другой стороны, приложение может быть запущено в режиме разработки операционным пользователь, например

./manage.py runserver

также.

Заимствовано из вопроса SO: https://stackoverflow.com/questions/4283132/apache-instance-user-permission-issue

Предполагая, что файлы принадлежат пользователю apache для запуска:

% chown -R apache.apache /var/www/mysite

устанавливать ACLs для пользователя / группы pi:

% setfacl -d -m u:pi:rwx /var/www/mysite
% setfacl -d -m g:pi:rwx /var/www/mysite

% getfacl /var/www/mysite
# file: /var/www/mysite
# owner: apache
# group: apache
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:pi:rwx
default:group::r-x
default:group:pi:rwx
default:mask::rwx
default:other::r-x

Вы можете сказать, что есть ACL с участием ls -l, завершающий "+" битов разрешений:

# ls -la /var/www
drwxr-xr-x   3 apache   apache   80 26. Nov 12:43 .
drwxrwxrwt  15 root     root 360 26. Nov 12:40 ..
drwxrwxr-x+  2 apache   apache   40 26. Nov 12:43 mysite

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

Для Windows 7, 8.1, 10, Server 2012 и т. Д. Следуйте Инструкции по установке Bonobo:

Разрешить пользователю IIS изменять папку C: \ inetpub \ wwwroot \ Bonobo.Git.Server \ App_Data.

Для этого:

  1. выберите Свойства папки App_Data,
  2. перейдите на вкладку Безопасность,
  3. нажмите редактировать,
  4. выберите пользователя IIS (в моем случае IIS_IUSRS) и добавьте разрешение на изменение и запись,
  5. подтвердите эти настройки кнопкой Применить.

Сервер разработки должен запускаться от имени того же пользователя, у которого есть разрешения на запись в папке базы данных, поэтому, если вы изначально создавали базу данных как root, вам нужно будет быть root при запуске:

python manage.py runserver

создать подкаталог в рабочем каталоге

mkdir db-folder 

создать базу данных sqlite в подкаталоге

sqlite3 db-folder/db.db

изменить владельца подкаталога на www-data в debain или apache в CentOS

chown -R www-data db-folder

и возьмите холодного пива, потому что все готово.

P / S: проверить, прошла ли процедура успешно

ls -l data-folder

ты должен увидеть такое

-rw-r--r-- 2 www-data root 4096 Jun 18 01:38 data-folder

просто пиши sudo sqlite3 databaseFilename.sql и это работа