Чому я отримую помилку 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 .інакше, є деяка чарівність команди chown, про яку я не знаю ... будь ласка, просвіти мене.
Джефф Шеффілд

3
Я вважаю, що додатковою точкою є встановлення групи за власною групою за замовчуванням. Інакше це не змінює групу. Це лише з пам'яті, настійно рекомендую спробувати це самостійно.
Нік Болтон

Узагальнений тут у випадку майбутнього гниття посилання або tl; dr: SQLite3 хоче записати доступ до каталогу файлу DB, щоб він міг створити файл журналу там, коли транзакція відкрита.
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

(або будь-який db, який ви використовуєте)

де 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-data до групи pi.

Примітка: якщо у вас ведеться реєстрація, вам потрібно буде це зробити і для журналу django, або апаш не сподобається.


1
Я думаю, ви могли просто додати користувача pi до групи www-даних. Також ви могли просто залишити файли такими, якими вони є, і скористатися командою setfacl для додавання списку контролю доступу для pi на файли та або каталоги.
slm

setfacl звучить як потенційно хороший варіант. Було б добре, щоб це було вказано як повчальну відповідь. Одна з проблем, з якою я стикаюся, полягає в тому, що мені потрібно часто тестувати .db файл. Коли вона буде відтворена, її потрібно знову погладити.
SpiRail

Дивіться мою відповідь на це запитання, serverfault.com/a/462970/2518 . Чи варто щось додати до того, що допомогло б?
slm

7

З Django каже : «Не вдається відкрити файл бази даних» при використанні SQLite3 розділу з помилок , Новачок вікі Джанго сторінки :

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

Скопіюйте / вставте відповідні частини посилання тут.
Крістоф Де Троєр

І це нагорода! :)
Крістоф Де Троєр

5

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

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

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

Мій операційний користувач hape отримує член www-data group:

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

Як результат, до бази даних можна отримати доступ для читання + запису апахе2-демон (користувальницькі www-дані), не надаючи кореневу кореневу папку проекту, і - з іншого боку - додаток можна запускати в робочому режимі операційним користувача, наприклад,

./manage.py runserver

також.


1

Позичено з питання ТА: https://stackoverflow.com/questions/4283132/apache-instan-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

Налаштування власника / групи на процес апаші для всього проекту джанго - це погана ідея, не потрібно давати зайвих привілеїв.
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. підтвердьте ці налаштування кнопкою Застосувати.

0

Сервер розробки повинен запускатися як той самий користувач, який має пермські записи в папці бази даних, тому якщо ви спочатку створили базу даних як root, вам потрібно буде мати root під час запуску:

python manage.py runserver

Хоча технічно правильно, запуск сервера, як rootце жахлива ідея, - краще було б chownбазі даних звичайному непривілейованому користувачеві, який зазвичай працює на сервері ...
voretaq7

0

створити підкаталог у робочому каталозі

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

Якщо ви збираєтесь опублікувати відповідь, будь ласка, надайте відповідь, яка суттєво відрізняється від інших відповідей на те саме питання.
masegaloeh

-1

просто напиши, sudo sqlite3 databaseFilename.sqlі це робота


Це може працювати для інтерактивного сеансу користувача, але це не рішення не для веб-додатків ...
HBruijn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.