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


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

попытаться написать базу данных readonly

Это имело смысл. Поэтому я отредактировал разрешения для файла, так что процесс 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

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


59
2017-08-23 12:08


Источник


Думаю, у вас возникла такая проблема, когда вы развертывали. - Mohammed Shareef C


Ответы:


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

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

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

sudo chown www-data .

73
2017-08-23 12:14



Это предполагает, что вы используете debian / ubuntu, если вы используете CentOS, вы захотите использовать «apache» вместо «www-data», - Luke Chadwick
@nbolton Примечание: chown www-data. . на самом деле chown www-data . в противном случае есть какая-то волшебная команда chown, о которой я не знаю ... пожалуйста, просветите меня. - Jeff Sheffield
Я считаю, что дополнительная точка - установить группу в группу по умолчанию владельца. В противном случае он не меняет группу. Это только из памяти, хотя я настоятельно рекомендую вам попробовать это самостоятельно. - Nick Bolton
Обобщенный здесь в случае будущей ссылки rot или tl; dr: SQLite3 хочет записать доступ к каталогу файла DB, чтобы он мог создать файл журнала там, когда транзакция открыта. - user1454265
Отлично подходит для пользователей Linux. Bupkiss для Windows. - Jay Blanchard


Из Django говорит «Не удается открыть файл базы данных» при использовании SQLite3  раздел из Ошибки новобрачных Django wiki страница:

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

6
2018-01-14 22:43



Скопируйте / вставьте соответствующие части ссылки здесь. - Christophe De Troyer
И это взлет! :) - Christophe De Troyer


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

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

(или что-нибудь, что вы используете)

где pi является пользователем, что я создал все файлы. (да, это малина pi)

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

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

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

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


5
2018-01-02 23:08



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


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

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

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-данных:

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

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

./manage.py runserver

также.


5
2018-04-14 12:22





Заимствованный из 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

1
2018-01-04 13:22



Установка владельца / группы в процесс apache для всего проекта django - плохая идея, не нужно давать лишние привилегии. - benjaoming


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

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

1
2017-11-11 20:23





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

python manage.py runserver

0
2017-12-19 09:35



В то время как технически корректно, запуск сервера как root это ужасный идея. Было бы лучше chown база данных для обычного непривилегированного пользователя, который обычно запускает сервер ... - voretaq7


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

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

0
2018-06-17 22:49



Если вы собираетесь опубликовать ответ, предоставьте ответ, который существенно отличается от других ответов на тот же вопрос. - masegaloeh


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


-1
2018-01-03 07:21



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