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

65

Используя мое приложение 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

Дайте мне знать, если трассировка стека необходима.

Ник Болтон
источник
Кажется, у вас возникла эта проблема при развертывании.
Мохаммед Шариф C

Ответы:

79

Ага, просто наткнулся на статью, объясняющую это. Также у Django есть информация на их странице NewbieMistakes .

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

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

sudo chown www-data .
Ник Болтон
источник
3
Это предполагает, что вы находитесь в Debian / Ubuntu, если вы используете CentOS, вы захотите использовать «apache» вместо «www-data»
Люк Чедвик
3
@nbolton Примечание: на chown www-data. .самом деле должно быть chown www-data .иначе, есть какая-то волшебная команда Чоун, о которой я не знаю ... пожалуйста, просветите меня.
Джефф Шеффилд
3
Я считаю, что дополнительной точкой является установка группы в группу по умолчанию владельца. В противном случае это не меняет группу. Это только по памяти, хотя, я настоятельно рекомендую вам попробовать это самостоятельно.
Ник Болтон
Здесь суммируется в случае будущей ссылки rot или tl; dr: SQLite3 хочет получить доступ на запись в каталог файла БД, чтобы он мог создать там файл журнала при открытии транзакции.
user1454265
Отлично подходит для пользователей Linux. Bupkiss для Windows.
Джей Бланшар
7

Мое решение этого было больше похоже на это. Я действительно не хотел менять владельца этого каталога. (в основном потому, что я использую пользователя 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 не понравится.

SpiRail
источник
1
Я думаю, вы могли бы просто добавить пользователя pi в группу www-data. Также вы могли бы просто оставить файлы такими, как они есть, и использовать команду setfacl, чтобы добавить список контроля доступа для pi в файлы и / или каталоги.
Slm
setfacl звучит как потенциально хороший вариант. Было бы хорошо, чтобы это было указано в качестве учебного ответа. Одна проблема, с которой я сталкиваюсь, заключается в том, что мне часто нужно удалять файл .db при тестировании. Когда его воссоздают, его нужно снова покушать.
SpiRail
Смотрите мой ответ на этот вопрос, serverfault.com/a/462970/2518 . Есть ли что-то еще, что я должен добавить к тому, что могло бы помочь?
Slm
7

В Django говорится «Невозможно открыть файл базы данных» при использовании раздела SQLite3 на вики- странице ошибок Django для новичков :

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

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

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

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

Мой оперативный пользователь hape получает члена группы 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

также.

Хартмут П.
источник
1

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

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

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

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

% 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
ОДС
источник
Установка владельца / группы для процесса apache для всего проекта django - плохая идея, нет необходимости давать ненужные привилегии.
Benjaoming
1

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

Для 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. подтвердите эти настройки кнопкой Применить.
DEXTER360
источник
0

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

python manage.py runserver
Kilizo
источник
Хотя технически правильно, сервер запускается как rootэто ужасная идея - Было бы лучше , чтобы chownбазы данных на регулярной непривилегированного пользователя , который обычно работает сервер ...
voretaq7
0

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

mkdir db-folder 

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

sqlite3 db-folder/db.db

смените владельца подкаталога на www-данные в 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
brotich
источник
Если вы собираетесь опубликовать ответ, пожалуйста, предоставьте ответ, который существенно отличается от других ответов на тот же вопрос.
masegaloeh
-1

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

Алиреза
источник
Это может работать для интерактивной пользовательской сессии, но это не решение, не для веб-приложения ...
HBruijn